TP 4

Transcription

TP 4
Travaux Pratiques : DOM
TP 4 : accès en C à un document XML
2011-2012
La librairie libxml2
On se propose d’utiliser la librairie libxml2 pour réaliser l’accès depuis C à des documents XML. On utilisera un accès
de type DOM, et l’on se reportera aux différentes fonctions d’accès disponibles dans la bibliothèque. Les liens à consulter en
priorité sont :
http ://xmlsoft.org/ Page principale
http ://xmlsoft.org/tutorial/xmltutorial.pdf Tutorial
http ://xmlsoft.org/examples/index.html Exemples de codes
http ://xmlsoft.org/html/index.html Description de l’API libxml2
Travail proposé
Exercice 1 On utilisera comme base le module parse1.c disponible dans les exemples de codes. Vérifiez que vous le
compilez correctement, et qu’il fonctionne lors d’un appel tel que :
$ parse1 recettes.xml
$
Exercice 2 Transformez le programme afin qu’il affiche le nom de l’élément racine du document xml passé en paramètre :
$ tp5a recettes.xml
Document is "recettes"
$
Faites lui afficher ensuite les noms tous les éléments enfants de cet élément racine, puis de tous les éléments enfants de ces
éléments :
$ tp5b recettes.xml
Document is "recettes"
Element : "recette"
Element : "titre"
Element : "difficulte"
Element : "ingredients"
Element : "recette"
Element : "titre"
Element : "difficulte"
Element : "ingredients"
Element : "preparation"
Element : "recette"
Element : "titre"
....
Exercice 3 On va maintenant se limiter aux titres des recettes, et tenter de réaliser l’équivalent du TP 2 : les titres des recettes,
d’abord :
$ tp5c recettes.xml
Document is "recettes"
"Recette de test"
"Carottes au beurre"
"Oeufs frais"
1
"Pâte brisée"
"Mousse au chocolat"
"Salade de fruits"
"Bettes au gruyere"
"Potage Saint-Germain"
"Thon à l’huile"
"Paupiettes de veau à la crème"
"Frites"
"Tiramisu"
On notera qu’il est fait appel à une procédure de « normalisation des espaces » (c.f. notes ci-dessous).
Les recettes au coût « faible » ensuite. Il convient d’accéder aux valeurs des attributs, et de comparer leurs valeurs avec le
critère attendu. On obtient alors la liste des recettes attendues :
$ tp5e recettes.xml
Document is "recettes"
"Recette de test"
"Carottes au beurre"
"Oeufs frais"
"Pâte brisée"
"Mousse au chocolat"
"Salade de fruits"
"Bettes au gruyere"
"Potage Saint-Germain"
"Thon à l’huile"
"Frites"
"Tiramisu"
On peut de même rechercher les recettes dont un ingrédient contient du sel (qui est toujours représenté par la chaîne « Sel ») :
$ tp5f recettes.xml
Document is "recettes"
"Recette de test"
"Carottes au beurre"
"Pâte brisée"
"Bettes au gruyere"
"Paupiettes de veau à la crème"
Exercice 4 On peut aussi aborder le travail d’un autre point de vue : la librairie libxml2 permet d’utiliser directement depuis
C les primitives de XPath. Le programme xpath1.c (également disponible dans les exemples de codes) est un exemple de
cette approche. Sous sa forme initiale, il permet d’afficher la liste des réponses à une requête XPath passée sur la ligne de
commande ; ainsi, la réponse à « quelle est la recette dont l’identification est "RF200-130B" » s’écrit :
$ xpath1 recettes.xml ’//titre[@id="RF200-130B"]/text()’
Result (1 nodes) :
= node "text" : type 3
La réponse ainsi fournie est peu parlante ; il suffit de modifier la procédure d’impression pour obtenir un programme plus
convivial :
$ xpath1 recettes.xml ’//titre[@id="RF200-130B"]/text()’
Result (1 nodes) :
"Paupiettes de veau à la crème"
Effectuez cette modification, et testez les différents exemples de recherche du TP XPath.
Informations utiles
La bibliothèque libxml2 est complexe à appréhender. Nous utilisons ici essentiellement les opérations d’accès à un arbre
XML représenté en mémoire. A ce titre les documentations pertinentes à consulter sont :
http ://xmlsoft.org/html/libxml-tree.html Documentation sur les arbres XML
libxml2/libxml/tree.h Fichier d’inclusion, décrivant les structures représentant les documents XML et les procédures d’accès. On y trouvera en particulier la description de la structure pointée par xmlNodePtr, la liste des types de noeuds
(xmlElementType), la description des noeuds de type attribut xmlAttrPtr, etc.
2
On peut, pour présenter plus agréablement les résultats, écrire en c l’équivalent de l’opération « normalize-space » de
XPath. Le fichier « normalizeSpaces.h » contient un extrait, un peu modifié, d’un code source de la bibliothèque qui
réalise cette fonction. Le fichier « Makefile » fourni peut aussi aider à simplifier la compilation des codes sources.
3

Documents pareils