XPath - XML Facile!

4.XPath

4.1.Introduction à XPath

XPath est une norme qui permet d'identifier (ou répérer) un ou plusieurs noeuds (i.e.balises) ou attributs dans un document XML.

4.2.Sélectionner un noeud avec XPath

Très grossièrement XPath est au document XML ce que le chemin est à une arborescence de fichiers.
Pour exemple la notation "/annuaire/personne/nom" fait référence à l'ensemble des balises "nom" que l'on trouve sous l'ensemble des balises "personne" que l'on trouve sous la balise racine "annuaire".
La différence majeure avec le chemin d'un fichier c'est que XPath peut (et ça arrive assez souvent) faire référence à un ensemble de noeuds et non pas à un noeud unique. Mais comme pour les fichiers nous avons droit aux notations suivantes:
Il est possible de sortir "un joker" pour retrouver des noeuds n'importe où sous un noeud donné. Pour cela il faut utiliser 2 slashes consécutifs '//'. Ainsi "/annuaire//nom" (ou "//nom") permet de faire référence à l'ensemble des balises "nom" qu'elles soient directement sous la racine "annuaire" ou sous un noeud "/annuaire/personne" voire sous quelque chose comme "/annuaire/electricien" et quelque soit la profondeur de la recherche. Ce chemin fait donc également référence à tous les "/annuaire/parprofession/electricien/personne/nom".
Il existe bon nombre d'autres "sélecteurs" que nous verrons par la suite.

4.3.Sélectionner un attribut avec XPath

Pour récupérer la valeur d'un attribut avec XPath, il faut créer le chemin vers le (ou les) élément(s) comme nous avons vu précédemment et ajouter '/@ suivi du nom de l'attribut.
Ainsi "/encyclopedie/personne/@sexe" permet de retourner la valeur de l'attribut "sexe" pour l'ensemble des personnes que l'on retrouve sous la racine "encyclopedie".

4.4.Introduction aux chemins conditionnels avec XPath

Nous l'avons dit, "par défaut" un chemin XPath retournera l'ensemble des noeuds qui correspondent aux instructions données. Il était donc nécessaire de permettre d'affiner la sélection. Pour cela il convient d'ajouter, dans le chemin XPath, la ou les conditions qui vont faire qu'un noeud va être retenu ou pas. C'est pourquoi nous serons souvent amenés à faire suivre le nom des noeuds concernés par une condition précisée entre crochets selon le modèle suivant: noeud[condition].

4.5.Les conditions (fonctions et opérateurs)

Le critère de sélection le plus simple consiste à préciser que l'on souhaite seulement retourner le n-ième élément qui correspond aux critères. Pour cela il suffit de préciser entre crochet la position voulue (sachant que le premier élément est à la position 1 - et non pas 0).
Ainsi "/encyclopedie/personne/nom[1]" retournera le premier "nom" rencontré dans le document XML pourvu qu'il soit sous une balise "personne", elle même sous la balise racine "encyclopedie".
Si nous avons imposé un seul "nom" par "personne" nous aurions aussi bien pu écrire "/encyclopedie/personne[1]/nom pour obtenir le même résultat. L'idée ici étant de retourner l'ensemble des noms du premier noeud "personne" trouvé sous la racine "encyclopedie". "/encyclopedie/personne[2]/nom" retournera en revanche le nom de la seconde personne.
En fait la notation [<nombre>] est un résumé de la notation [position() == <nombre>]. Ainsi "nom[2]" est équivalent à "nom[position() == 2]"
Il existe de nombreuses autres fonctions dont
Quant aux opérateurs, vous avez le choix entre:

4.6.Chemins conditionnels par l'exemple

On peut donc avoir des expressions du genre ./ssniveau[position()<3] pour avoir les 2 premiers sous niveaux nommé "ssniveau" /ssracine[position()=last()] pour avoir le dernier élément "ssracine" ./ssniveau[attribute::nomattribut="nomcherche"] pour avoir ceux ayant nomattribut="nomcherche" ./[ssniveau or ssniveau2] pour avoir les élément nommés "ssniveau" ou "ssniveau2" Ce qui peut s'écrire de façon abrégée /ssracine[last()] pour avoir le dernier élément "ssracine" ./ssniveau[@nomattribut="nomcherche"] pour avoir ceux ayant nomattribut="nomcherche"