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

De Wicri Manuel
imported>Jacques Ducloy
(Constructeurs effectivement utiles)
imported>Jacques Ducloy
(Les attributs)
 
(42 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 +
{{Exploration corpus, header
 +
|module=Introduction à la programmation en C des arbres Xml
 +
|précédent=Prise de contact avec XML
 +
|suivant=Introduction aux serveurs d'exploration sous Unix
 +
}}
 +
 
Cette page reprend une section du cours qui était donné pour l'utilisation de la plateforme Dilib.
 
Cette page reprend une section du cours qui était donné pour l'utilisation de la plateforme Dilib.
  
Ligne 37 : Ligne 43 :
 
La méthode permettant d'accéder au premier fils est :
 
La méthode permettant d'accéder au premier fils est :
 
<source lang="c">
 
<source lang="c">
   SxmlNode *SxmlFirstChild (SgmlNode *nx)
+
   SxmlNode *SxmlFirstChild (SgmlNode *nx);
 
</source>
 
</source>
Les méthodes peuvent être combinées. Voici un exemple de programme que vous pouvez reproduire et adapter.
+
Les méthodes peuvent être combinées. Voici un exemple de programme que vous pouvez reproduire et d'adapter.
 
<source lang="c">
 
<source lang="c">
 
#include "SxmlNode.h"
 
#include "SxmlNode.h"
Ligne 59 : Ligne 65 :
 
Si ce programme est rangé dans le fichier myTest.c, [[Installation de l'environnement Dilib|dans le cas d'une installation locale standard]], il pourra être compilé par :
 
Si ce programme est rangé dans le fichier myTest.c, [[Installation de l'environnement Dilib|dans le cas d'une installation locale standard]], il pourra être compilé par :
 
<source lang="sh">
 
<source lang="sh">
. ~/Dilib/init.sh
 
 
gcc myTest.c $DILIB_CC -o myTest
 
gcc myTest.c $DILIB_CC -o myTest
 
./myTest
 
./myTest
 
</source>
 
</source>
 +
 +
Attention les variables locales de Dilib doivent avoir été initialisées.
 +
{{Début 2 colonnes}}
 +
Avec une installation ScienceExplor
 +
<source lang="sh">
 +
source $HOME/Documents/ExplorScience/Dilib/init.sh
 +
</source>
 +
{{Saut 2 colonnes}}
 +
Sur d'autres installations
 +
<source lang="sh">
 +
. ~/Dilib/init.sh
 +
</source>
 +
{{Fin 2 colonnes}}
 +
  
 
;Accès au dernier fils:
 
;Accès au dernier fils:
Ligne 68 : Ligne 87 :
 
SxmlLastChild(SgmlNode *)
 
SxmlLastChild(SgmlNode *)
 
</pre>
 
</pre>
 +
 
===SxmlText===
 
===SxmlText===
 
Un objet de type SxmlText contient une chaîne de caractères. Dans l'exemple ci-dessus, les parties « a1 », « b1 » et « c1 » sont de ce type.  
 
Un objet de type SxmlText contient une chaîne de caractères. Dans l'exemple ci-dessus, les parties « a1 », « b1 » et « c1 » sont de ce type.  
Ligne 80 : Ligne 100 :
 
</source>
 
</source>
 
Le type est un code interne qui définit le type de nœud. Par exemple le code <code>XML_NODE_COMMENT</code> (ou 8) est associé à un commentaire XML.<ref>La liste des codes peut être obtenue par la commande shell : <code>grep "define XML_NODE"</code> $DILIB/include/SxmlNode.h</ref>
 
Le type est un code interne qui définit le type de nœud. Par exemple le code <code>XML_NODE_COMMENT</code> (ou 8) est associé à un commentaire XML.<ref>La liste des codes peut être obtenue par la commande shell : <code>grep "define XML_NODE"</code> $DILIB/include/SxmlNode.h</ref>
{{Wicri travaux|texte=cours en phase d'installation à partir de ce point}}
 
  
 
===Constructeurs effectivement utiles===
 
===Constructeurs effectivement utiles===
  
 
:Création d'un élément qui n'a pas encore de contenu.  
 
:Création d'un élément qui n'a pas encore de contenu.  
<pre>
+
<source lang="c">
 
SxmlNode *SxmlElementCreate(tag);
 
SxmlNode *SxmlElementCreate(tag);
 
           char *tag;
 
           char *tag;
</pre>
+
</source>
 
:Création d'un élément avec son contenu textuel. .
 
:Création d'un élément avec son contenu textuel. .
 
<pre>
 
<pre>
SgmlNode *SxmlLeafCreate(tag, string);
+
SxmlNode *SxmlLeafCreate(tag, string);
 
           char *tag;
 
           char *tag;
 
           char *string;
 
           char *string;
Ligne 99 : Ligne 118 :
 
SxmlElementCreate("a");        /* construit <a></a> */
 
SxmlElementCreate("a");        /* construit <a></a> */
  
SxmlLeafCreat("a","text"); /* construit <a>text</a> */
+
SxmlLeafCreate("a","text"); /* construit <a>text</a> */
 
</pre>
 
</pre>
  
 
==Méthodes de construction de base==
 
==Méthodes de construction de base==
<ul>
+
===<code>SxmlAddFirstChild</code> et <code>SxmlAppendChild</code>===
  
<li>Ajout d'un nouvel &eacute;l&eacute;ment en t&ecirc;te des fils
+
:Ajout d'un nouvel élément en tête des fils  
 
<pre>
 
<pre>
SgmlNode *SxmlAddFirstChild(pere, fils);
+
SxmlNode *SxmlAddFirstChild(pere, fils);
         SgmlNode *pere, *fils;
+
         SxmlNode *pere, *fils;
 
</pre>
 
</pre>
<li>Ajout d'un nouvel &eacute;l&eacute;ment en queue de la liste des fils
+
:Ajout d'un nouvel élément en queue de la liste des fils  
 
<pre>
 
<pre>
SgmlNode *SgmlAppendChild(pere,fils);
+
SxmlNode *SxmlAppendChild(SxmlNode *pere, SxmlNode * fils);
        SgmlNode *pere, *fils;
 
 
</pre>
 
</pre>
</ul>
 
<H2 CLASS="Intitul&eacute;2">
 
  
Exemple :</H2>
+
===Exemple===
<center><table border=4><tr><td>
+
<source lang="c">
<pre>
+
/* création de <a><b>b1</b><c>c1</c></a> */
/* cr&eacute;ation de &lt;a&gt;&lt;b&gt;b1&lt;/b&gt;&lt;c&gt;c1&lt;/c&gt;&lt;/a&gt; */
 
  
#include &quot;Sgml.h&quot;
+
#include "SxmlNode.h"
 
   main()
 
   main()
 
     {
 
     {
         SgmlNode *root;
+
         SxmlNode *root;
root =SgmlCreateMark(&quot;a&quot;);
+
root =SxmlElementCreate("a");
SgmlAddLast(root, SgmlCreateLeaf(&quot;b&quot;,&quot;b1&quot;));
+
SxmlAppendChild (root, SxmlLeafCreate("b", "b1"));
SgmlAddLast(root, SgmlCreateLeaf(&quot;c&quot;,&quot;c1&quot;));
+
SxmlAppendChild (root, SxmlLeafCreate("c", "c1"));
         SgmlPrint(root);
+
         SxmlPrint(root);
 
         putchar('\n');
 
         putchar('\n');
 
         exit(0);
 
         exit(0);
 
     }
 
     }
</pre>
+
</source>
</td></tr></table></center>
+
 
 
===Exercices===
 
===Exercices===
<ul>
+
 
<li>Modifier le programme pr&eacute;c&eacute;dent pour qu'il imprime le document SGML donn&eacute;
+
<span id="exercice 1">Modifier le programme précédent pour qu'il imprime le document XML donné en introduction de ce chapitre : ([[Discussion:Introduction à la programmation en C des arbres Xml#Premier exercice|solution en page discussion]])
en introduction de ce chapitre :
 
 
<pre>
 
<pre>
 
   &lt;a&gt;a1&lt;b&gt;b1&lt;/b&gt;&lt;c&gt;c1&lt;/c&gt;&lt;/a&gt;
 
   &lt;a&gt;a1&lt;b&gt;b1&lt;/b&gt;&lt;c&gt;c1&lt;/c&gt;&lt;/a&gt;
 
</pre>
 
</pre>
<li>Ecrire un programme qui produise le document suivant:
+
<span id="exercice 2">Écrire un programme qui produise le document suivant : ([[Discussion:Introduction à la programmation en C des arbres Xml#Deuxième exercice|solution en page discussion]])
<pre>
+
<source lang="xml">
   &lt;doc&gt;&lt;tit&gt;Tintin au Congo&lt;/tit&gt;&lt;kw&gt&lt;e&gt;Tintin&lt;/e&gt;&lt;e&gt;Milou&lt;/e&gt;&lt;/kw&gt;&lt;/doc&gt;
+
   <doc>
</pre>
+
      <title>Tintin au Congo</title>
</ul>
+
      <authors>
 +
            <author>Hergé</author>
 +
      </authors>
 +
      <lkw>
 +
          <kw>Tintin</kw>
 +
          <kw>Milou</kw>
 +
    </lkw>
 +
  </doc>
 +
</source>
  
 +
==Les attributs==
 +
Les éléments d'un document XML peuvent être qualifiés (ou complétés) par des attributs.
  
<address><a href="#sommaire">-&gt; sommaire</a></address>
+
Ainsi, dans l'exemple prédédent, il est possible de qualifier les mots clés :
<a name=access>
+
<source lang="xml">
<hr>
+
      <lkw>
 +
          <kw type="person">Tintin</kw>
 +
          <kw type="animal">Milou</kw>
 +
    </lkw>
 +
</source>
  
 +
Pour cela, on utilise la fonction <code>SxmlSetAttribute()</code> à 3 paramètres :
 +
<source lang="xml">
 +
SxmlNode *SxmlSetAttribute(SxmlNode *element, char *attributeName, char *attributeValue);
 +
</source>
 +
;paramètres:
 +
#'''element''' : le nœud sur lequel s'applique la fonction.
 +
#'''attributeName''' : le nom de l'attribut à créer (ou modifier) ;
 +
#'''attributeValue''' : la valeur de l'attribut à créer ;
  
==Accès à l'environnement d'un nœud==
+
;Exemple :
  
<H2 CLASS="Intitul&eacute;2">
+
<source lang="c">
Les voisins ou parents</H2>
+
  SxmlNode *tintin;
<p>
 
Toutes les fonctions retournent un pointeur NULL en cas d'&eacute;chec.</p>
 
<ul>
 
<p><pre>
 
SgmlNode *SgmlNext(node);</pre></p>
 
<p><pre>
 
SgmlNode *SgmlPrevious(node);</pre></p>
 
<P CLASS="programme"><pre>
 
SgmlNode *SgmlFirst(node);</pre></P>
 
<p><pre>
 
SgmlNode *SgmlLast(node);</pre></p>
 
<P>
 
<pre>
 
SgmlNode *SgmlFather(node);</pre></P>
 
</ul>
 
  
<H2 CLASS="Intitul&eacute;2">
+
  ...
  
Les caract&eacute;ristiques d'un noeud</H2>
+
tintin=SxmlLeafCreate("kw", "tintin");
<ul>
+
SxmlSetAttribute (tintin, "type", "person");
<h3 CLASS="Liste&agrave;Puces">
+
</source>
  
pour un noeud de type Mark</h3>
+
;Exercice:
<P CLASS="programme">
+
<span id="exercice 3">Écrire un programme qui crée et imprime le document suivant : ([[Discussion:Introduction à la programmation en C des arbres Xml#Troisième exercice|solution en page discussion]])
 
+
<source lang="xml">
<pre>char *SxmlNodeName(node);</pre></P>
+
<pubmed>
 
+
  <MedlineCitation Status="MEDLINE" Owner="NLM">
 
+
    <PMID Version="1">7843359</PMID>
<h3 CLASS="Liste&agrave;Puces">
+
    <DateCompleted>
 
+
        <Year>1995</Year>
pour un noeud de type Data</h3>
+
        <Month>03</Month>
<P CLASS="programme">
+
         <Day>08</Day>
<pre>
+
    </DateCompleted>
char *SxmlText(noeud);</pre></P>
+
    <Author ValidYN="Y">
 
+
        <LastName>Flahault</LastName>
 
+
        <ForeName>A</ForeName>
<h3 CLASS="Liste&agrave;Puces">
+
        <Initials>A</Initials>
 
+
        <AffiliationInfo>
test de type</h3>
+
            <Affiliation>Faculté de Médecine Saint-Antoine, Paris, France.</Affiliation>
<P CLASS="programme">
+
        </AffiliationInfo>
int SgmlIsData(node);</P>
+
    </Author>
<P CLASS="programme">
+
   </MedlineCitation>
<pre>
+
</pubmed>
int SgmlIsMark(node);</pre></P>
+
</source>
</ul>
 
 
 
<address><a href=#sommaire>-&gt; sommaire</a></address>
 
<a name=iter>
 
<hr>
 
 
 
<H1 align=center>
 
It&eacute;rations sur les composants d'un noeud</H1>
 
 
 
<H2 CLASS="Intitul&eacute;2">
 
<A NAME="pgfId=145835">
 
</A>
 
Principe</H2>
 
<P CLASS="Courant">
 
<A NAME="pgfId=145836">
 
</A>
 
Toutes les fonctions renvoient la valeur NULL en cas d'&eacute;chec ou d'absence d'un &eacute;l&eacute;ment.</P>
 
 
 
 
 
<H2 CLASS="Intitul&eacute;2">
 
<A NAME="pgfId=145837">
 
</A>
 
Squelette d'une it&eacute;ration sur les fils d'un noeud</H2>
 
 
 
<center><table border=4><tr><td>
 
<pre>
 
 
 
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&eacute;2">
 
 
 
Exemple</H2>
 
<P CLASS="Courant">
 
 
 
&eacute;dition de toutes les &eacute;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(&quot;%s\n&quot;,SgmlTag(son));
 
      } while ((son=SgmlNext(son)));
 
}
 
</pre>
 
</td></tr></table></center>
 
 
 
<address><a href=#sommaire>-&gt; sommaire</a></address>
 
<a name=io>
 
<hr>
 
 
 
<H1 align=center>
 
Import Export de structures SGML</H1>
 
<P CLASS="Courant">
 
<A NAME="pgfId=141012">
 
</A>
 
Si la cha&icirc;ne d'entr&eacute;e est en forme normale,
 
la construction d'un arbre SGML peut se faire sans DTD.</P>
 
 
 
 
 
<H2>
 
Conversion SGML &lt;-&gt; string</H2>
 
Les fonctions d'entr&eacute;es sorties utilisent un
 
noyau de 2 proc&eacute;dures de conversion vers les
 
chaine (char *) de C.
 
<ul>
 
<li>Conversion d'un arbre SGML en String
 
<pre>
 
char *SgmlToString(node);
 
      SgmlNode *node;
 
<li>Construction d'un arbre SGML &agrave; partir d'une string.
 
</pre>
 
<pre>
 
SgmlNode* SxmlFromString(string);
 
                  char *string;
 
</pre>
 
</ul>
 
<H2>
 
Entr&eacute;es-sorties (Dam = Dilib Access Method)</H2>
 
Les fonctions qui r&eacute;alisent les entr&eacute;es sorties sont r&eacute;alis&eacute;es
 
&agrave; partir des fonction pr&eacute;c&eacute;dentes.
 
<ul>
 
<li>Impression d'un objet SGML sur la sortie standard :
 
<pre>
 
SgmlPrint(node);
 
</pre>
 
<li>Impression d'un objet SGML dans un fichier :
 
<pre>
 
SxmlFilePrint(file, node);
 
              FILE *file;
 
</pre>
 
 
 
<li>lecture du prochain document SGML sur l'entr&eacute;e standard.
 
<pre>
 
SgmlNode *SxmlInputNextDocumentElement();
 
</pre>
 
</ul>
 
 
 
<H2>
 
Exemple</H2>
 
<P>
 
Impression de tous les premiers fils ayant &#171;a&#187; pour tag.</P>
 
 
 
<center><table border=4><tr><td>
 
<pre>
 
#include &#171;Sgml.h&#187;
 
main()
 
{
 
  SgmlNode *docu ,*son;
 
   while(docu=SgmlInputNextDocument())
 
    {
 
      if (son=SgmlFirst(docu))
 
        {if (strcmp(SgmlTag(son),&quot;a&quot;)==0)
 
                {SgmlPrint(son);putchar('\n');
 
    }}};
 
}
 
</pre>
 
</td></tr></table></center>
 
<address><a href=#sommaire>-&gt; sommaire</a></address>
 
<hr>
 
 
 
    <center>
 
    <table>
 
    <tr>
 
      <td>
 
    <a href="http://www.loria.fr/dilib"><IMG SRC="http://www.loria.fr/dilib/Icones/dilibHome.gif"></a>
 
      </td>
 
<td>
 
  [ <a href="http://www.loria.fr/projets/dilib/doc.html"><b>Cours DILIB</b></a> ]
 
      </td>
 
    </tr>
 
   
 
    </table>
 
    </center>
 
[[Catégorie : Programmation XML en langage C]]
 
  
 
==Voir aussi==
 
==Voir aussi==
 
;notes:
 
;notes:
 
<references/>
 
<references/>
 +
 +
[[Catégorie : Programmation XML en langage C]]

Version actuelle datée du 22 juin 2020 à 18:43

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 la norme XML avec des adaptations légères (Stream XML ou Sxml) pour pouvoir manipuler des grandes quantités de documents XML.

L'objet de base : SxmlNode

Les arbres Sxml 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 objets SxmlNode

Tout objet de type SxmlNode 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

A partir du type de base SxmlNode, un ensemble de types dérivés sont disponibles, nous nous intéressons maintenant aux 2 types permettant de réaliser l'essentiel des structures XML : les éléments XML (ici SxmlElement) qui réalisent le balisage et les zones de texte (SxmlText).

SxmlElement

Un objet de type SxmlElement est généralement la racine d'un sous-arbre. Dans la figure ci-dessus les nœuds <a>, <b> et <c> sont de type SxmlElement.

Accès au premier fils

La méthode permettant d'accéder au premier fils est :

   SxmlNode *SxmlFirstChild (SgmlNode *nx);

Les méthodes peuvent être combinées. Voici un exemple de programme que vous pouvez reproduire et d'adapter.

#include "SxmlNode.h"
#include <stdio.h>
main()
{
   SxmlNode *myNodeTest;  /* déclaration d'un pointeur qui sera associé 
                             à l'arbre donné en exemple */
   myNodeTest=SxmlFromString("<a>b1<c>c1</c></a>");
   SxmlPrint (myNodeTest);    /* doit imprimer : <a>b1<c>c1</c></a> */
   putchar ('\n');
   SxmlPrint (SxmlFirstChild(myNodeTest));    /* doit imprimer : b1 */
   putchar ('\n');
   SxmlPrint (SxmlNextSibling(SxmlFirstChild(myNodeTest)));    /* doit imprimer : <c>c1</c> */
   putchar ('\n');
}

Si ce programme est rangé dans le fichier myTest.c, dans le cas d'une installation locale standard, il pourra être compilé par :

gcc myTest.c $DILIB_CC -o myTest
./myTest

Attention les variables locales de Dilib doivent avoir été initialisées.

Avec une installation ScienceExplor

source $HOME/Documents/ExplorScience/Dilib/init.sh
 

Sur d'autres installations

. ~/Dilib/init.sh


Accès au dernier fils
SxmlLastChild(SgmlNode *)

SxmlText

Un objet de type SxmlText contient une chaîne de caractères. Dans l'exemple ci-dessus, les parties « a1 », « b1 » et « c1 » sont de ce type.

Construction d'arbres Sxml

Constructeur de base

Toutes les fonctions de création utilisent un constructeur de base qui n'est pratiquement jamais directement utilisé par l'utilisateur. Ce paragraphe est donc simplement destiné à la compréhension de l'ensemble.

 SxmlNode *SxmlNodeCreate(type);
          char type;

Le type est un code interne qui définit le type de nœud. Par exemple le code XML_NODE_COMMENT (ou 8) est associé à un commentaire XML.[1]

Constructeurs effectivement utiles

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

SxmlLeafCreate("a","text"); /* construit <a>text</a> */

Méthodes de construction de base

SxmlAddFirstChild et SxmlAppendChild

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

Exemple

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

#include "SxmlNode.h"
  main()
    {
        SxmlNode *root;
	root =SxmlElementCreate("a");
	SxmlAppendChild (root, SxmlLeafCreate("b", "b1"));
	SxmlAppendChild (root, SxmlLeafCreate("c", "c1"));
        SxmlPrint(root);
        putchar('\n');
        exit(0);
    }

Exercices

Modifier le programme précédent pour qu'il imprime le document XML donné en introduction de ce chapitre : (solution en page discussion)

   <a>a1<b>b1</b><c>c1</c></a>

Écrire un programme qui produise le document suivant : (solution en page discussion)

   <doc>
      <title>Tintin au Congo</title>
       <authors>
             <author>Hergé</author>
       </authors>
      <lkw>
           <kw>Tintin</kw>
           <kw>Milou</kw>
     </lkw>
   </doc>

Les attributs

Les éléments d'un document XML peuvent être qualifiés (ou complétés) par des attributs.

Ainsi, dans l'exemple prédédent, il est possible de qualifier les mots clés :

      <lkw>
           <kw type="person">Tintin</kw>
           <kw type="animal">Milou</kw>
     </lkw>

Pour cela, on utilise la fonction SxmlSetAttribute() à 3 paramètres :

 SxmlNode *SxmlSetAttribute(SxmlNode *element, char *attributeName, char *attributeValue);
paramètres
  1. element : le nœud sur lequel s'applique la fonction.
  2. attributeName : le nom de l'attribut à créer (ou modifier) ;
  3. attributeValue : la valeur de l'attribut à créer ;
Exemple 
  SxmlNode *tintin;

   ...

 tintin=SxmlLeafCreate("kw", "tintin");
 SxmlSetAttribute (tintin, "type", "person");
Exercice

Écrire un programme qui crée et imprime le document suivant : (solution en page discussion)

<pubmed>
  <MedlineCitation Status="MEDLINE" Owner="NLM">
     <PMID Version="1">7843359</PMID>
     <DateCompleted>
        <Year>1995</Year>
        <Month>03</Month>
        <Day>08</Day>
     </DateCompleted>
    <Author ValidYN="Y">
        <LastName>Flahault</LastName>
        <ForeName>A</ForeName>
        <Initials>A</Initials>
        <AffiliationInfo>
            <Affiliation>Faculté de Médecine Saint-Antoine, Paris, France.</Affiliation>
        </AffiliationInfo>
     </Author>
  </MedlineCitation>
</pubmed>

Voir aussi

notes
  1. La liste des codes peut être obtenue par la commande shell : grep "define XML_NODE" $DILIB/include/SxmlNode.h