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