site de Fabien Torre


Cours sur les requêtes XPath

Présentation du langage d'interrogation XPath.

Généralités

XPath est un langage d'interrogation des documents XML. Il permet de sélectionner certaines parties d'un document XML : des sous-arbres, des noeuds, des attributs, etc.

XPath est central dans le monde XML, il intervient comme brique de base dans d'autres technologies XML :

  • XML Schémas (expression des contraintes d'unicité et de clefs),
  • les transformations XSLT,
  • XQuery
  • XLink
  • XPointer, etc.

Voir la recommandation du W3C sur XPath :

La syntaxe générale

Le premier concept est celui de noeud courant : c'est l'endroit d'où l'on part. En première lecture on peut imaginer qu'il s'agit de la racine du document, mais n'importe quel noeud peut jour ce rôle. À partir de là, on considère trois éléments :

  • un axe : la direction dans laquelle on se dirige à partir du noeud courant (vers le père, vers les fils, vers les frères de gauche, etc.) ;
  • un filtre : le type de noeuds qui nous intéresse dans l'axe choisi (des noeuds quelconques, des éléments quelconques ou un élément précis, des commentaires, etc.) ;
  • un prédicat optionnel : des conditions supplémentaires pour sélectionner des noeuds parmi ceux retenus par le filtre dans l'axe.

Ils constituent à eux trois une étape et on les note axe::filtre[prédicat]. L'enchaînement de plusieurs étapes constitue une chemin XPath :

axe1::filtre1[prédicat1]/axe2::filtre2[prédicat2]

Exemple concret :

parent::*/child::node()[position()=2]

Si le chemin commence par un /, il s'agit d'un chemin absolu, c'est-à-dire prenant son origine à la racine du document et non pas au noeud courant.

Il est possible de faire une disjonction de requêtes XPath avec le signe | ; on obtient alors l'union des deux ensembles de noeuds correspondants.

axe1::filtre1[prédicat1]/axe2::filtre2[prédicat2] | axe3::filtre3[prédicat3]

Chaque étape renvoie un ensemble de noeuds et pour chacun d'entre eux, on applique les étapes suivantes.

Les axes

  • self : le noeud courant lui-même ;
  • child : les enfants du noeud courant ;
  • descendant, descendant-or-self : tous les descendants du noeud courant ;
  • parent : le père du noeud courant ;
  • ancestor, ancestor-or-self : les ancêtres du noeud courant ;
  • attribute : les attributs du noeud courant ;
  • preceding, following : les noeuds, précédants ou suivants, du noeud courant, dans l'ordre de lecture du document ;
  • preceding-sibling, following-sibling : les frères, précédant ou suivant, le noeud courant ;
  • namespace : les espaces de noms.

Les filtres

  • node() : tous les noeuds ;
  • text() : les noeuds textuels ;
  • * : tous les éléments ;
  • nom : les éléments portant ce nom ;
  • comment() : les noeuds commentaires ;
  • processing-instruction('cible') : les noeuds instructions, seulement les instructions cible si cet argument est fourni.

Les prédicats

Ils prennent la forme de tests que les noeuds sélectionnés devront vérifier. Ces tests peuvent impliquer des fonctions ou de nouveaux chemins XPath.

child::toto[position()=2]
child::toto[@ref='id125']

Il est possible de combiner ces tests à l'aide des opérateurs logiques classiques (and, or et not) ou de les enchaîner :

child::toto[@ref='id125' or @ref='id47']
child::toto[contains(text(),'coucou') and position()=2]
child::toto[contains(text(),'coucou')][position()=2]

Les deux dernières requêtes ne sont pas équivalentes :

  • la première renvoie le deuxième fils toto si celui-ci contient le texte coucou ;
  • la seconde sélectionne tous les fils toto qui contiennent le texte coucou et parmi ceux-ci renvoie le deuxième.

Les fonctions

Ces fonctions peuvent apparaître dans des prédicats ou être utilisées directement dans un évaluateur d'expressions XPath.

Il y a des fonctions sur les chaînes de caractères et qui vont donc porter sur les contenus textuels de noeuds :

  • concat : colle ensemble les chaînes de caractères passées en paramètres ;
  • string-length : la longueur de la chaîne fournie ;
  • contains, starts-with, ends-with : tests d'appartenance d'une chaîne dans une autre.

Des fonctions qui prennent en argument une requête XPath et vont donc porter sur des ensembles de noeuds :

  • count : le nombre de noeuds dans l'ensemble sélectionné par la requête ;
  • name : le nom de l'élément courant.

Et enfin, nous disposons de fonctions sans paramètre mais liées au noeud courant :

  • position : le numéro du noeud courant dans la liste des noeuds considérés ;
  • last : le nombre de noeuds sélectionnés à l'étape courante.

La syntaxe abrégée

Cette notation est plus simple mais pas aussi expressive que la notation étendue. De plus, l'équivalent étendu de certaines notations abrégées n'est pas toujours celui que l'on pense.

Syntaxe abrégéeSyntaxe étendue
.self::node()
totochild::toto
../totoparent::toto
@titiattribute::titi
//toto/descendant-or-self::node()/child::toto
.//totodescendant-or-self::node()/child::toto
toto[2]child::toto[position() = 2]

Notez bien que la notation // implique de repartir depuis la racine ; si l'on veut un descendant-or-self depuis le noeud courant, on écrira .//.

Il faut prendre garde également au fait que //toto[2] n'est pas équivalent à
/descendant-or-self::toto[position()=2]
mais à
/descendant-or-self::node()/child::toto[position()=2]

Autrement dit :

  • //toto[2] fournit tous les noeuds toto qui sont deuxième fils de leur père ;
  • /descendant-or-self::toto[position()=2] désigne un unique noeud, le deuxième noeud toto du document.

Accueil > Enseignement > Cours > Documents numériques > XML > XPath
(contenu mis à jour )
site de Fabien Torre, université de Lille

Description

Survoler un lien de navigation pour lire sa description ici...