Introduction à la programmation en C des arbres Xml : Différence entre versions

De Wicri Manuel
imported>Jacques Ducloy
imported>Jacques Ducloy
(Types dérivés)
Ligne 36 : Ligne 36 :
 
<li>acc&egrave;s au premier fils
 
<li>acc&egrave;s au premier fils
 
<pre>
 
<pre>
SgmlFirst (SgmlNode *)
+
SxmlFirstChild (SgmlNode *)
 
</pre>
 
</pre>
 
       <li><p>acc&egrave;s au dernier fils</p>
 
       <li><p>acc&egrave;s au dernier fils</p>
 
<pre>
 
<pre>
SgmlLast(SgmlNode *)
+
SxmlLastChild(SgmlNode *)
 
</pre>
 
</pre>
 
</ul>
 
</ul>
Ligne 46 : Ligne 46 :
 
<h3 CLASS="Liste&agrave;Puces">
 
<h3 CLASS="Liste&agrave;Puces">
  
SgmlData </h3>
+
SxmlText </h3>
 
(correspondant &agrave; a1, b1, c1)
 
(correspondant &agrave; a1, b1, c1)
  
Ligne 68 : Ligne 68 :
 
<ul>
 
<ul>
 
<pre>
 
<pre>
SgmlNode *SgmlCreateNode(type);
+
SxmlNode *SxmlNodeCreate(type);
 
           char type;
 
           char type;
 
</pre>
 
</pre>
Ligne 80 : Ligne 80 :
 
<li>Cr&eacute;ation d'un &eacute;l&eacute;ment qui n'a pas encore de contenu.
 
<li>Cr&eacute;ation d'un &eacute;l&eacute;ment qui n'a pas encore de contenu.
 
<pre>
 
<pre>
SgmlNode *SgmlCreateMark(tag);
+
SgmlNode *SxmlElementCreate(tag);
 
           char *tag;
 
           char *tag;
 
</pre>
 
</pre>
 
<li>Cr&eacute;ation d'un &eacute;l&eacute;ment avec son contenu textuel.
 
<li>Cr&eacute;ation d'un &eacute;l&eacute;ment avec son contenu textuel.
 
<pre>
 
<pre>
SgmlNode *SgmlCreateLeaf(tag, string);
+
SgmlNode *SxmlLeafCreate(tag, string);
 
           char *tag;
 
           char *tag;
 
           char *string;
 
           char *string;
Ligne 103 : Ligne 103 :
 
<li>Ajout d'un nouvel &eacute;l&eacute;ment en t&ecirc;te des fils
 
<li>Ajout d'un nouvel &eacute;l&eacute;ment en t&ecirc;te des fils
 
<pre>
 
<pre>
SgmlNode *SgmlAddFirst(pere, fils);
+
SgmlNode *SxmlAddFirstChild(pere, fils);
 
         SgmlNode *pere, *fils;
 
         SgmlNode *pere, *fils;
 
</pre>
 
</pre>
 
<li>Ajout d'un nouvel &eacute;l&eacute;ment en queue de la liste des fils
 
<li>Ajout d'un nouvel &eacute;l&eacute;ment en queue de la liste des fils
 
<pre>
 
<pre>
SgmlNode *SgmlAddLast(pere,fils);
+
SgmlNode *SgmlAppendChild(pere,fils);
 
         SgmlNode *pere, *fils;
 
         SgmlNode *pere, *fils;
 
</pre>
 
</pre>
Ligne 180 : Ligne 180 :
 
<P CLASS="programme">
 
<P CLASS="programme">
  
<pre>char *SgmlTag(node);</pre></P>
+
<pre>char *SxmlNodeName(node);</pre></P>
  
  
Ligne 188 : Ligne 188 :
 
<P CLASS="programme">
 
<P CLASS="programme">
 
<pre>
 
<pre>
char *SgmlDataString(noeud);</pre></P>
+
char *SxmlText(noeud);</pre></P>
  
  
Ligne 283 : Ligne 283 :
 
</pre>
 
</pre>
 
<pre>
 
<pre>
SgmlNode* SgmlFromString(string);
+
SgmlNode* SxmlFromString(string);
 
                   char *string;
 
                   char *string;
 
</pre>
 
</pre>
Ligne 298 : Ligne 298 :
 
<li>Impression d'un objet SGML dans un fichier :
 
<li>Impression d'un objet SGML dans un fichier :
 
<pre>
 
<pre>
SgmlFilePrint(file, node);
+
SxmlFilePrint(file, node);
 
               FILE *file;
 
               FILE *file;
 
</pre>
 
</pre>
Ligne 304 : Ligne 304 :
 
<li>lecture du prochain document SGML sur l'entr&eacute;e standard.
 
<li>lecture du prochain document SGML sur l'entr&eacute;e standard.
 
<pre>
 
<pre>
SgmlNode *SgmlInputNextDocument();
+
SgmlNode *SxmlInputNextDocumentElement();
 
</pre>
 
</pre>
 
</ul>
 
</ul>

Version du 28 octobre 2013 à 19:09

Cette page reprend une section du cours qui était donné pour l'utilisation de la plateforme Dilib.

Arbres XML - notions de base

La bibliothèque Dilib est basée sur le norme Xml avec des adaptations légères pour pouvoir manipuler des grandes quantités de documents Xml.

L'objet de base : SxmlNode

Les arbres Xml sont réalisés à l'aide d'une structure élémentaire unique nommée "SxmlNode"

un arbre Xml contenant 6 nœuds

Type de base : SxmlNode

Nous avons adopté "un style objet" en programmation C. Les arbres Xml (ou les sous-arbres) seront toujours repérés pas des pointeurs sur des SxmlNode.

Les méthodes élémentaires associées aux SxmlNode

Tout objet de type SgmlNode aura trois méthodes permettant d'accéder au père et aux frères d'un nœud Xml.

Accès au parent
SxmlNode *SxmlParent (SxmlNode *myNode);

Un nœud Xml n'a, au plus, qu'un seul parent. C'est ainsi que des arbres peuvent être réalisés. Dans la figure précédente le noeud <b> est le parent de b1.

Accès au suivant
SxmlNode *SxmlNextSibling (SxmlNode *myNode);
Accès au précédant
SxmlNode *PreviousSibling (SxmlNode *myNode);

Types dérivés

logo travaux cours en phase d'installation à partir de ce point
SxmlElement
(correspondant à <a>, <b>,<c>)
  • accès au premier fils
    SxmlFirstChild (SgmlNode *)
    
  • accès au dernier fils

    SxmlLastChild(SgmlNode *)
    

SxmlText

(correspondant à a1, b1, c1)


<address><a href="#sommaire">-> sommaire</a></address>


<a name=build>

Construction d'arbres SGML

Constructeur de base

Toutes les fonctions de création utilisent un constructeur de base qui n'est pratiquement jamais directement utilisé par l'utilisateur :

    SxmlNode *SxmlNodeCreate(type);
              char type;
    

Constructeurs effectivement utiles :

  • Création d'un élément qui n'a pas encore de contenu.
    SgmlNode *SxmlElementCreate(tag);
              char *tag;
    
  • Création d'un élément avec son contenu textuel.
    SgmlNode *SxmlLeafCreate(tag, string);
              char *tag;
              char *string;
    
  • Exemples
    SgmlCreateMark("a");        /* <a></a> */
    
    SgmlCreateLeaf("a","text"); /* <a>text</a> */
    


Méthodes de construction de base

  • Ajout d'un nouvel élément en tête des fils
    SgmlNode *SxmlAddFirstChild(pere, fils);
            SgmlNode *pere, *fils;
    
  • Ajout d'un nouvel élément en queue de la liste des fils
    SgmlNode *SgmlAppendChild(pere,fils);
            SgmlNode *pere, *fils;
    

Exemple :

/* création de <a><b>b1</b><c>c1</c></a> */

#include "Sgml.h"
  main()
    {
        SgmlNode *root;
	root =SgmlCreateMark("a");
	SgmlAddLast(root, SgmlCreateLeaf("b","b1"));
	SgmlAddLast(root, SgmlCreateLeaf("c","c1"));
        SgmlPrint(root);
        putchar('\n');
        exit(0);
    }

Exercices

  • Modifier le programme précédent pour qu'il imprime le document SGML donné en introduction de ce chapitre :
       <a>a1<b>b1</b><c>c1</c></a>
    
  • Ecrire un programme qui produise le document suivant:
       <doc><tit>Tintin au Congo</tit><kw&gt<e>Tintin</e><e>Milou</e></kw></doc>
    


<address><a href="#sommaire">-> sommaire</a></address> <a name=access>


Accès à l'environnement d'un noeud

Les voisins ou parents

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

    SgmlNode *SgmlNext(node);

    SgmlNode *SgmlPrevious(node);

    SgmlNode *SgmlFirst(node);

    SgmlNode *SgmlLast(node);

    SgmlNode *SgmlFather(node);

Les caractéristiques d'un noeud

    pour un noeud de type Mark

    char *SxmlNodeName(node);


    pour un noeud de type Data

    char *SxmlText(noeud);


    test de type

    int SgmlIsData(node);

    int SgmlIsMark(node);

<address><a href=#sommaire>-> sommaire</a></address> <a name=iter>


Itérations sur les composants d'un noeud

<A NAME="pgfId=145835"> </A> Principe

<A NAME="pgfId=145836"> </A> Toutes les fonctions renvoient la valeur NULL en cas d'échec ou d'absence d'un élément.


<A NAME="pgfId=145837"> </A> Squelette d'une itération sur les fils d'un noeud


if ((son = SgmlFirst (node))
    {
        do 
           { <i>traitement sur son</i> }
	while ((son=SgmlNext(son));
    }
else
    { <i>traitement de l'exception </i>}
<pre>
</td></tr></table></center>

<H2 CLASS="Intitulé2">

Exemple</H2>
<P CLASS="Courant">

		édition de toutes les étiquettes des fils d'un noeud</P>
<center><table border=4><tr><td>
<pre>
editSonTag(node)
          SgmlNode *node;
{
  SgmlNode *son;
  if ((son=SgmlFirst(node)))
	do{ if(SgmlIsMark(son))
	          printf("%s\n",SgmlTag(son));
      } while ((son=SgmlNext(son)));
}

<address><a href=#sommaire>-> sommaire</a></address> <a name=io>


Import Export de structures SGML

<A NAME="pgfId=141012"> </A> Si la chaîne d'entrée est en forme normale, la construction d'un arbre SGML peut se faire sans DTD.


Conversion SGML <-> string

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

  • Conversion d'un arbre SGML en String
    char *SgmlToString(node);
          SgmlNode *node;
    <li>Construction d'un arbre SGML à partir d'une string.
    
    SgmlNode* SxmlFromString(string);
                       char *string;
    

Entrées-sorties (Dam = Dilib Access Method)

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, node);
                  FILE *file;
    
  • lecture du prochain document SGML sur l'entrée standard.
    SgmlNode *SxmlInputNextDocumentElement();
    

Exemple

Impression de tous les premiers fils ayant «a» pour tag.

#include «Sgml.h»
main()
{
  SgmlNode *docu ,*son;
  while(docu=SgmlInputNextDocument())
    {
       if (son=SgmlFirst(docu))
         {if (strcmp(SgmlTag(son),"a")==0)
                 {SgmlPrint(son);putchar('\n');
    }}};
}

<address><a href=#sommaire>-> sommaire</a></address>


   <a href="http://www.loria.fr/dilib"></a>
  [ <a href="http://www.loria.fr/projets/dilib/doc.html">Cours DILIB</a> ]