Introduction à la programmation en C des arbres Xml
Introduction à la programmation en C des arbres Xml < = Prise de contact avec XML Introduction aux serveurs d'exploration sous Unix => |
Cette page reprend une section du cours qui était donné pour l'utilisation de la plateforme Dilib.
Sommaire
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"
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
- 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 ;
- 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
- ↑ La liste des codes peut être obtenue par la commande shell :
grep "define XML_NODE"
$DILIB/include/SxmlNode.h