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:
  • / qui est le séparateur et qui, placé au début, indique le noeud racine
  • . qui indique le noeud courant (dépend donc du contexte)
  • .. qui indique le noeud parent (dépend donc du contexte)
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
  • position() qui retourne l'indice du noeud
  • last() qui retourne l'indice du dernier noeud
  • text() qui retourne le texte associé au noeud
Quant aux opérateurs, vous avez le choix entre:
  • condition1 or condition2, qui attend donc que l'une ou l'autre des conditions soit remplie
  • condition1 and condition2, qui attend donc que les deux conditions soient remplies
  • valeur1 == valeur2, qui attend donc que les deux valeurs soient égales
  • valeur1 != valeur2, qui attend donc que les deux valeurs soient différentes
  • valeur1 <= valeur2, qui attend donc que la valeur1 soit inférieure ou égale à la valeur2
  • valeur1 < valeur2, qui attend donc que la valeur1 soit strictement inférieure à la valeur2
  • valeur1 >= valeur2, qui attend donc que la valeur1 soit supérieure ou égale à la valeur2
  • valeur1 > valeur2, qui attend donc que la valeur1 soit strictement supérieure à la valeur2

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"