XPath

Documentation eedomus

Expressions

Considérons le document XML suivant :

 <?xml version="1.0"?>
 <racine>
  <encyclopedie nom="Wikipedia" site="http://fr.wikipedia.org/">
   <article nom="XPath">   
    <auteurs>
     <auteur>
      <nom>Dupont</nom>
     </auteur>
     <auteur>
      <nom>Dubois</nom>
     </auteur>
    </auteurs>
   </article>
  </encyclopedie>
 </racine>

alors les expressions XPath suivantes

Expression XPath Résultat
/ sélectionne un nœud "fictif", dit root element, qui englobe tout le document, y compris le doctype
/root sélectionne le nœud vide, puisqu'il n'y a pas d'élément "root" (mais "racine")
//article sélectionne tous les éléments "article" du document où qu'ils soient
/racine/encyclopedie sélectionne l'unique élément "encyclopedie" puisqu'il est ici le seul fils de "racine" portant ce nom
//article[@nom='XPath'] sélectionne tous les éléments "article" du document où qu'ils soient, ayant un attribut "nom" dont la valeur est "XPath"


Toutes ces expressions XPath sont absolues (elles commencent par un caractère "/"), c'est-à-dire qu'elles donnent le même résultat quel que soit le contexte.

Les expressions suivantes sont relatives. Si le contexte courant est l'unique élément "encyclopedie", elles donnent :

Expression XPath Résultat
article sélectionne l'élément "article"
racine ne sélectionne rien, vu le contexte
article[1]/auteurs/auteur[2] sélectionne le second auteur (Dubois) du premier article
article[ count( article/auteurs/auteur) >1 ] sélectionne les articles qui ont au moins 2 auteurs
../racine sélectionne l'élément "racine", puisqu'il est parent de l'élément courant


Tester vos expressions XPath

Vos expressions peuvent être évaluées sur cette page de test


xPath Operators

Il est possible de manipuler les résultats des noeuds XML avec des opérateurs xPath, en voici quelques exemples:

  • Pour diviser par 10 le résultat obtenu:
(/SENSORS/TEMPERATURE/VALUE) div 10
  • Pour multiplier par 100 le résultat obtenu:
(/SENSORS/TEMPERATURE/VALUE) * 100


Les fonctions suivantes sont également supportées:


Pour arrondir à l'entier inférieur (tronquer)

floor(nombre)

Pour arrondir à l'entier supérieur

ceiling(nombre)

Pour arrondir à l'entrée le plus proche

round(nombre)

Pour compter le nombre de noeuds que retournera le xPath

count(xpath)

Pour concaténer 2 chaines de caractères

concat(chaine1, chaine2)

Pour ne récupérer qu'une partie d'une chaine de caractères

substring(chaine, debut, longueur)
substring(chaine, debut)

Pour ne conserver que les données avant un caractère donné

substring-before(chaine1, chaine2)

Pour ne conserver que les données après un caractère donné

substring-after(chaine1, chaine2)

Pour récupérer la longueur d'une chaine

string-length(chaine)


Pour remplacer des caractères par d'autres

translate(chaine1, chaine2, chaine3)

Exemple: translate('12:30','30','45') Résultat: '12:45'

Exemple: translate('12:30','03','54') Résultat: '12:45'

Exemple: translate('12:30','0123','abcd') Résultat: 'bc:da'


La fonction replace() n'est pas supporté, mais une fonction spécifique change() peut être utilisée. La fonction peut être apellée une ou plusieurs fois en fin d'expression xPath afin de remplacer une chaine en une autre:

change(chaine_originale, nouvelle_chaine)


Quelques exemples d'utilisation de fonctions:

  • Pour ne conserver que les données après le '.':
substring-after(/SENSORS/TEMPERATURE/VALUE, '.')
  • Pour récupérer uniquement le 2nde caractère lu:
substring(/SENSORS/TEMPERATURE/VALUE, 2, 1)
  • Pour compter le nombre de nœuds XML:
count(/SENSORS/TEMPERATURE)
  • Pour récupérer un noeud en contournant un éventuel namespace par défaut:
//*[local-name() = 'VALUE']