Sxml, Import Export de structures XML : Différence entre versions
imported>Jacques Ducloy (→Conversion d'objets Xml en chaînes de caractère, et réciproquement) |
imported>Jacques Ducloy (→Entrées-sorties) |
||
Ligne 26 : | Ligne 26 : | ||
==Entrées-sorties== | ==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). | + | Les fonctions qui réalisent les entrées sorties sont réalisées à partir des fonctions précédentes et utilisent, pour les entrées, un lecteur, ou moteur de lecture (un SxmlRecordReader). Il contrôle la gestion du flux d'entrées et l'appel au parser. |
− | === | + | ===Exportation (impressions)=== |
− | |||
*Impression d'un objet XML sur la sortie standard : | *Impression d'un objet XML sur la sortie standard : | ||
<source lang="c"> | <source lang="c"> | ||
Ligne 43 : | Ligne 42 : | ||
</source> | </source> | ||
===Lecture d'un fichier contenant une suite d'enregistrements=== | ===Lecture d'un fichier contenant une suite d'enregistrements=== | ||
+ | Dans les cas simples, un lecteur implicite facilite les opérations. | ||
+ | |||
Cette façon de procéder implique une explicitation du lecteur, un <code>SxmlRecordReader</code> qui hérite de la structure de base le <code>SxmlNode</code>. Un tel objet est manipulé à partir des opérations suivantes. | Cette façon de procéder implique une explicitation du lecteur, un <code>SxmlRecordReader</code> qui hérite de la structure de base le <code>SxmlNode</code>. Un tel objet est manipulé à partir des opérations suivantes. | ||
: | : |
Version du 12 avril 2013 à 06:51
Sommaire
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;
Attention, cette fonction renvoie un pointeur sur une chaîne dont la durée de vie n'est pas garantie (en particulier chaque appel à cette fonction génère une nouvelle valeur pointée). Lr programmeur dot gérer la pérennité.
- 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, pour les entrées, un lecteur, ou moteur de lecture (un SxmlRecordReader). Il contrôle la gestion du flux d'entrées et l'appel au parser.
Exportation (impressions)
- 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
Dans les cas simples, un lecteur implicite facilite les opérations.
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');
}
}