Sxml, Import Export de structures XML : Différence entre versions
imported>Jacques Ducloy m (30 révisions importées) |
imported>Jacques Ducloy (→Lecture d'un fichier contenant une suite d'enregistrements) |
||
(3 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 44 : | Ligne 44 : | ||
Dans les cas simples, un lecteur implicite facilite les opérations (et rend transparent ce lecteur interne). | Dans les cas simples, un lecteur implicite facilite les opérations (et rend transparent ce lecteur interne). | ||
− | Une seule fonction est alors utile dans les cas simples : <code> | + | Une seule fonction est alors utile dans les cas simples : <code>SxmlInputGetDocumentElement</code>. |
*lecture du prochain document XML sur l'entrée standard. | *lecture du prochain document XML sur l'entrée standard. | ||
<source lang="c"> | <source lang="c"> | ||
− | SxmlNode * | + | SxmlNode *SxmlInputGetDocumentElement(); |
</source> | </source> | ||
Cette fonction retourne un pointeur sur la racine du document et la veleur NULL en fin de fichier. | Cette fonction retourne un pointeur sur la racine du document et la veleur NULL en fin de fichier. | ||
+ | |||
==Exemples== | ==Exemples== | ||
Ligne 59 : | Ligne 60 : | ||
{ | { | ||
SxmlNode *docu ,*son; | SxmlNode *docu ,*son; | ||
− | while((docu= | + | while((docu=SxmlInputGetDocumentElement())) |
{ | { | ||
if (son=SxmlFirstChild(docu)) | if (son=SxmlFirstChild(docu)) | ||
Ligne 73 : | Ligne 74 : | ||
{ | { | ||
SxmlNode *docu; | SxmlNode *docu; | ||
− | while((docu= | + | while((docu=SxmlInputGetDocumentElement())) |
{ | { | ||
SxmlNode *nouveauFils; | SxmlNode *nouveauFils; | ||
Ligne 89 : | Ligne 90 : | ||
{ | { | ||
SxmlNode *docu; | SxmlNode *docu; | ||
− | while((docu= | + | while((docu=SxmlInputGetDocumentElement())) |
{ | { | ||
SxmlAppendChild(docu,SxmlLeafCreate("a","nouveau")); | SxmlAppendChild(docu,SxmlLeafCreate("a","nouveau")); | ||
Ligne 97 : | Ligne 98 : | ||
} | } | ||
</source> | </source> | ||
+ | |||
==Voir aussi== | ==Voir aussi== | ||
Pour en savoir plus sur les entrées sorties, voir sur Wicri/Outils : | Pour en savoir plus sur les entrées sorties, voir sur Wicri/Outils : |
Version actuelle datée du 25 juin 2020 à 08:02
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).
Écritures ou exportation d'arbres Sxml
- 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 d'un fichier contenant une suite d'enregistrements
Le SxmlRecordReader
sert à contrôler la gestion du flux d'entrées et l'appel au parser.
Dans les cas simples, un lecteur implicite facilite les opérations (et rend transparent ce lecteur interne).
Une seule fonction est alors utile dans les cas simples : SxmlInputGetDocumentElement
.
- lecture du prochain document XML sur l'entrée standard.
SxmlNode *SxmlInputGetDocumentElement();
Cette fonction retourne un pointeur sur la racine du document et la veleur NULL en fin de fichier.
Exemples
- Impression de tous les premiers fils ayant « a » pour tag.
#include "SxmlNode.h"
main()
{
SxmlNode *docu ,*son;
while((docu=SxmlInputGetDocumentElement()))
{
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=SxmlInputGetDocumentElement()))
{
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=SxmlInputGetDocumentElement()))
{
SxmlAppendChild(docu,SxmlLeafCreate("a","nouveau"));
SxmlPrint(docu);
putchar('\n');
}
}
Voir aussi
Pour en savoir plus sur les entrées sorties, voir sur Wicri/Outils :