Sxml, Import Export de structures XML : Différence entre versions

De Wicri Manuel
imported>Jacques Ducloy
(Lecture d'un fichier contenant une suite d'enregistrements)
imported>Jacques Ducloy
Ligne 1 : Ligne 1 :
 +
{{Wicri travaux|texte=cette page est la première réalisation d'un futur manuel d'utilisation de la [[bibliothèque Dilib]]}}
 
==Principes élémentaires==
 
==Principes élémentaires==
  

Version du 27 septembre 2012 à 13:48

logo travaux cette page est la première réalisation d'un futur manuel d'utilisation de la bibliothèque Dilib

Principes élémentaires

Si la chaîne d'entrée est constituée d'objets Xml bien formés, la construction d'un arbre XML peut se faire sans DTD (ni schéma).

La philosophie Dilib impose souvent l'absence de sauts de ligne ou de tabulations pour l'utilisation de filtres sous Unix. Le parser Dilib proprement dit traite des objets Xml quelconques.

Conversion d'objets Xml en chaînes de caractère, et réciproquement

Les fonctions d'entrées sorties utilisent un noyau de 2 procédures de conversion vers les chaînes (char *) de C.

Conversion d'un arbre Sxml en String
    char *SxmlToString(node);
          SxmlNode *node;
Construction d'un arbre Sxml à partir d'une string.
    SxmlNode *SxmlFromString(str);
          char *str;

Entrées-sorties

Les fonctions qui réalisent les entrées sorties sont réalisées à partir des fonctions précédentes et utilisent un lecteur, ou moteur de lecture (un SxmlRecordReader).

Cas simples

Dans les cas simples, un lecteur implicite facilite les opérations.

  • Impression d'un objet XML sur la sortie standard :
    SxmlPrint(node);
  • Impression d'un objet XML dans un fichier :
    SxmlFilePrint(node, file);
                  FILE *file;
  • lecture du prochain document XML sur l'entrée standard.
    SxmlNode *SxmlInputNextDocumentElement();

Lecture d'un fichier contenant une suite d'enregistrements

Cette façon de procéder implique une explicitation du lecteur, un SxmlRecordReader qui hérite de la structure de base le SxmlNode. Un tel objet est manipulé à partir des opérations suivantes.

Déclaration
      SxmlRecordReader *myReader;
Création
     myReader=SxmlRecordReaderCreate();
Ouverture
Cette procédure utilise un paramètre de type chaîne qui désigne le chemin d'accès (path) au fichier qui sera exploité ultérieurement.
     SxmlRecordReaderOpen(SxmlRecordReader *myReader, char* myFilePath);
Lecture
SxmlReaderNextDocumentElement(SxmlRecordReader *myReader)

Ces 4 fonctions suffisent dans les cas simples. D"autres procédures sont disponibles pour affiner les cas plus complexes.

Exemples

Impression de tous les premiers fils ayant « a » pour tag.
#include "SxmlNode.h"
main()
{
  SxmlNode *docu ,*son;
  while((docu=SxmlInputNextDocumentElement()))
    {
       if (son=SxmlFirstChild(docu))
         {if (SxmlNodeHasName(son,"a"))
                 {SxmlPrint(son);putchar('\n');
    }}}
}
Ajout d'un nouvel élément à tous les documents.
#include "SxmlNode.h"
main()
{
  SxmlNode *docu;
  while((docu=SxmlInputNextDocumentElement()))
    {
       SxmlNode *nouveauFils;
       nouveauFils=XmlLeafCreate("a","nouveau");
       SxmlAppendChild(docu,nouveauFils);
       SxmlPrint(docu);
       putchar('\n');
    }
}
ou en écriture plus compacte 
#include "SxmlNode.h"
main()
{
  SxmlNode *docu;
  while((docu=SxmlInputNextDocumentElement()))
    {
       SxmlAppendChild(docu,SxmlLeafCreate("a","nouveau"));
       SxmlPrint(docu);
       putchar('\n');
    }
}