Rechercher une donnée dans un document XML (SAX)

Problème

Vous voulez trouver une donnée dans un fichier XML sans pour autant le charger intégralement en mémoire.

Solution

Codez les tests adéquats dans les fonctions de rappel en utilisant certaines informations fournies par libxml2 via le contexte.

Discussion

Libxml2 ne propose pas une fonction de recherche de nœuds avec XPath. Il serait possible de le faire via les fonctions de rappel et l’API de la bibliothèque spécifique à XPath, mais cela se limiterait à des expressions simples. En effet, il ne faut pas perdre de vue que l’analyseur syntaxique ne place rien en mémoire de l’arborescence de l’arbre XML, ce qui empêche toute recherche contenant des axes autres que celui du nœud père vers le nœud fils.

Par conséquent, il est plus simple de coder soi-même les tests de recherche dans les fonctions de rappel. Pour cela, nous disposons du nœud courant fourni en argument à la fonction de rappel de début de balise ; idem pour celle de fin de balise. La liste des attributs est aussi fournie à la fonction en début de balise. À tout moment, via le contexte, nous pouvons connaître le chemin du nœud courant grâce aux champs nameNr et nameTab. Voici quelques exemples de tests :


/* Test sur le nom d'une balise. */ 
void 
cb_sax_start_element (void *user_data, const xmlChar * name, 
                      const xmlChar...
Pour consulter la suite, découvrez le livre suivant :
couv_EI3CACT.png
60-signet.svg
En version papier
20-ecran_lettre.svg
En version numérique
41-logo_abonnement.svg
En illimité avec l'abonnement ENI
130-boutique.svg
Sur la boutique officielle ENI
Précédent
Parcourir un document XML avec SAX
Suivant
Lire un flux de données XML