Exploration d'un document XML en langage C

De Wicri Manuel
Révision datée du 21 juin 2020 à 22:38 par imported>Jacques Ducloy (Jacques Ducloy a déplacé la page Exploration d'un document XML sous Unix vers Exploration d'un document XML en langage C)

Accès à l'environnement d'un nœud

Les voisins ou parents

Toutes les fonctions retournent un pointeur NULL en cas d'échec.

SxmlNode *SgmlNextSibling(SxmlNode *node);
SxmlNode *SxmlPreviousSibling(SxmlNode *node);
SxmlNode *SxmlFirstChild(SxmlNode *node);
SxmlNode *SxmlLastChild(SxmlNode *node);
SxmlNode *SgmlParent(SxmlNode *node);

Les caractéristiques d'un nœud

Pour un nœud de type SxmlElement

char *SxmlNodeName(node);

Pour un noeud de type SxmlText :

char *SxmlText(noeud);

test de type

int SgmlIsText(node);
int SgmlIsElement(node);


Itérations sur les composants d'un noeud

Principe

Toutes les fonctions renvoient la valeur NULL en cas d'échec ou d'absence d'un élément. Ceci permet de réaliser des itérations sur les objets XML contenus dans un élément.

Squelette d'une itérations sur les fils d'un nœud.

Avec une boucle do
if ((fils = SxmlFirstChild (pere)))
  {
    do 
      { traitement sur fils }
    while ((fils=SxmlNextSibling(fils)));
  }
else
 { traitement de l'exception}
Avec une boucle while
 fils = SxmlFirstChild (pere);
 while (fils)
  {
    traitement sur fils 
    fils=SxmlNextSibling(fils);
  }

Exemple

Édition de toutes les étiquettes des fils d'un nœud.

editChildTag ( SxmlNode *node)
{
  SxmlNode *c1;
  if ((c1=SxmlFirstChild(node)))
	do{ 
            if(SxmlIsElement(c1))
	        printf("%s\n",SgmlTag(c1));
      } while ((son=SxmlNextSibling(c1)));
}

Itérateurs

Dans la bibliothèque Dilib, un itérateur est associé à un élément XML. La fonction SxmlNextNode renvoie le fils suivant. La fonction SxmlReset initialise l'itérateur. L'exemple précédent se réécrit ainsi.

editChildTag ( SxmlNode *node)
{
  SxmlNode *c1;
  SxmlReset (node);
  while (c1=SxmlNextNode(node))
    {
       if(SxmlIsElement(c1)) printf("%s\n",SgmlTag(c1));
    }
}

Import Export de structures SGML

Si la chaîne d'entrée est en forme normale, la construction d'un arbre XML peut se faire sans DTD ni schéma.

Conversion XML en string

Les fonctions d'entreés sorties utilisent un noyau de 2 procédures de conversion vers les chaine (char *) de C.

Conversion d'un arbre XML en String

char *SxmlToString (SgmlNode *node);

Construction d'un arbre SGML à partir d'une string.

SxmlNode* SxmlFromString(char *string);

Entrées-sorties

Les fonctions qui réalisent les entrées sorties sont réalisées à partir des fonction précédentes.

Impression d'un objet SGML sur la sortie standard :

SgmlPrint(node);

Impression d'un objet SGML dans un fichier :

SxmlFilePrint(FILE *file, SxmlNode* node);          ;

lecture du prochain document SGML sur l'entrée standard.

SgmlNode *SxmlInputNextDocumentElement();

Exemple

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 (strcmp(SxmlNodeName(son), "a")==0)
                 {SxmlPrint(son);putchar('\n');
    }}};
}