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']