XPath : un langage pour intérroger les fichiers XML

22/10/2004

La spécification XPath est assez simple. Peu de notions permettent de composer une expression qui localisera, dans le document XML, une simple valeur, ou un ensemble de noeuds. Une expression XPath définit un (ou une combinaison de) chemin de localisation. Un chemin est une représentation d’un parcours de l’arbre XML jusqu’à l’information désirée. Le parcours peut être absolu, c’est à dire qu’il part de la racine du document, ou relatif (un noeud sert de point de départ). Le chemin de localisation est composé d’une ou plusieurs étapes de localisation.

Chaque étape est découpée en trois parties : un axe, un test de noeud, et un ou plusieurs prédicats (que l’on peut schématiser par la syntaxe "axe::test[predicat]"). L’axe indique la direction dans laquelle démarrer le parcours : les axes fils, descendant, parent, ancêtre, voisin, espace de noms, attribut permettent de sélectionner un premier sous-ensemble de noeuds. Le test de noeud diminue le précédent résultat en ne sélectionnant que les noeuds qui répondent positivement au test. Par exemple /descendant::personne est un chemin de localisation qui ne contient qu’une seule étape de localisation. Elle part de la racine (chemin absolu commençant par un /), utilise l’axe descendant pour ne sélectionner que les noeuds situés sous la racine, et applique une nouvelle restriction à cet ensemble, en ne gardant que les éléments dont le nom de balise est "personne". La troisième et dernière partie de l’étape de localisation permet de raffiner une nouvelle fois en appliquant des prédicats, par exemple : le premier noeud de l’ensemble, celui qui contient un attribut nom valant "dupond" (/descendant::personne[@nom="dupond"]), etc… Le caractère / permet d’enchaîner plusieurs étapes de localisation.

Cette technologie gigogne peut devenir rapidement verbeuse. C’est la raison pour laquelle, XPath définit une notation abrégée pour certains noms d’axe et pour certains tests (.. pour l’axe parent, @ pour l’axe attribut, personne[1] pour personne[position()=1], etc…). Ainsi, l’expression

/descendant::personne[position()=1]/descendant-or-self::
node()/child::voiture[attribute::couleur="rouge"]

peut s’écrire de façon plus concise

//personne[2]//voiture[@couleur="rouge"]

Enfin, une panoplie de fonctions manipulant les ensembles de noeuds, les chaînes de caractères, les nombres ou encore les booléens complète les concepts évoqués précédemment. XPath offre donc un moyen de concentrer dans une seule expression un parcours simple ou extrêmement complexe de l’arbre XML, permettant de localiser les données recherchées. Cependant, certaines requêtes restent impossibles à formuler. XPath 2 (document de travail du W3C proche du statut de recommandation) apportera alors une solution à ce problème marginal.