Tutoriel XPath pour débutant
Avec la propagation du XML comme langage de balisage afin de permettre un échange de données indépendant de la plateforme, un standard donnant les moyens à des applications qui ne sont pas basées sur XML d’envoyer des requêtes complexes à des documents XML est devenu une nécessité.
L’Extensible Markup Language (abrégé en XML) est un langage de balisage servant à afficher des données structurées hiérarchiquement sous forme textuelle. Le XML est aussi bien lisible par l’homme que par machine et est notamment utilisé sur le World Wide Web pour l’échange de données entre deux systèmes informatiques.
Les standards correspondants, qui permettent un accès contrôlé par programme aux documents XML, ont été développés par le consortium W3 avec XQuery et XSLT. Ces derniers fournissent des interfaces de programmation que les applications peuvent utiliser pour accéder aux documents XML, interroger des contenus ou transformer des documents XML. Pour y parvenir, un standard qui permet l’adressage des éléments dans les documents XML est toutefois nécessaire : le langage de requête XPath.
Nous vous familiarisons avec le modèle de données XPath (XDM) et vous présentons sa syntaxe qui est à l’origine des expressions XPath pour la localisation des éléments XML.
- Domaine .eu ou .fr + éditeur de site gratuit pendant 6 mois
- 1 certificat SSL Wildcard par contrat
- Boîte email de 2 Go
Qu’est-ce que XPath ?
L’XML Path Language (XPath) est un langage de requête pour les documents XML développé par le consortium W3. XPath met à disposition des utilisateurs une syntaxe non basée sur XML permettant d’adresser les éléments d’un document XML de façon ciblée.
En général, XPath est intégré dans un langage d’hôte (Host Language) qui permet un traitement des éléments XML adressés. XQuery sert par exemple à interroger des éléments XML adressés par XPath. XSLT utilise le langage de requête pour la transformation des documents XML.
- XPath : navigation dans les documents XML
- XQuery : interrogations de documents XML
- XSLT : transformation de documents XML
XPath 3.1, la version actuelle, est spécifiée dans la recommandation W3C du 21 mars 2017.
Malgré de nouvelles versions, un grand nombre de processeurs XSLT, de navigateurs web et d’applications sont toujours uniquement compatibles avec le standard XPath 1.0 de 1999.
Comment fonctionne XPath ?
XPath est basé sur un modèle de données qui interprète les documents XML comme une séquence d’éléments disposés dans une arborescence. L’arborescence du modèle de données XPath est comparable à celle du Document Object Model (DOM) qui agit comme une interface entre le HTML et le JavaScript dynamique dans les navigateurs web.
La localisation des éléments XML est effectuée sous la forme de chemins, à la manière du système de répertoires Unix. Les éléments de base de ces chemins de localisation sont les nœuds, les axes, les tests de nœud et les prédicats.
Types de nœuds
Les différents éléments d’une arborescence XPath sont appelés des nœuds. L’ordre des nœuds est déterminé à la fois par la séquence du document et par l’imbrication des éléments XML.
Le modèle de données XPath distingue sept types de nœuds avec différentes fonctionnalités :
- les nœuds élément (element node),
- les nœuds document (root node) (à partir de XPath 2.0, auparavant nœuds racine),
- les nœuds attribut (attribute node),
- les nœuds texte (text node),
- les nœuds espace de noms (namespace node),
- les nœuds instruction de traitement (processing instruction node),
- les nœuds commentaire (comment node).
Nous vous expliquons les types de nœuds du modèle de données XPath à l’aide d’un exemple. Le document XML suivant permet l’échange de données dans le cadre d’une commande de livre et comprend les sept types de nœuds.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Order SYSTEM "order.dtd">
<?xml-stylesheet type="text/css" href="style.css"?>
<!--Ceci est un commentaire!-->
<order date="2019-02-01">
<address xmlns:shipping="http://localhost/XML/delivery" xmlns:billing="http://localhost/XML/billing">
<shipping:name>Ellen Adams</shipping:name>
<shipping:street>123 Maple Street</shipping:street>
<shipping:city>Mill Valley</shipping:city>
<shipping:state>CA</shipping:state>
<shipping:zip>10999</shipping:zip>
<shipping:country>États-Unis</shipping:country>
<billing:name>Mary Adams</billing:name>
<billing:street>8 Oak Avenue</billing:street>
<billing:city>Old Town</billing:city>
<billing:state>PA</billing:state>
<billing:zip>95819</billing:zip>
<billing:country>États-Unis</billing:country>
</address>
<comment>Veuillez utiliser un emballage cadeau !</comment>
<items>
<book isbn="9781408845660">
<title>Harry Potter et le prisonnier d’Azkaban</title>
<quantity>1</quantity>
<priceus>22.94</priceus>
<comment>Veuillez confirmer la date de livraison avant Noël.</comment>
</book>
<book isbn="9780544003415">
<title>Le seigneur des anneaux</title>
<quantity>1</quantity>
<priceus>17.74</priceus>
</book>
</items>
</order>
Nœuds élément (element node)
Dans l’arborescence du modèle de données XPath, chaque élément du document XML correspond à un nœud élément. Il existe toutefois deux exceptions : la déclaration XML et la définition du type de document au début du document.
Déclaration XML :
<?xml version="1.0"? encoding="utf-8"?>
Définition du type de document (DTD) :
<!DOCTYPE Order SYSTEM "order.dtd">
Les nœuds élément commencent par une balise de début, se terminent par une balise de fin et sont généralement imbriqués les uns dans les autres.
Le premier nœud élément dans la séquence du document est appelé nœud racine.
Le document XML présenté ci-dessus contient par exemple le nœud élément order comme élément racine. Celui-ci fonctionne comme élément parent des nœuds élément subordonnés address, comment et items qui contiennent à leur tour d’autres nœuds élément comme éléments enfant.
Nœuds document (document node)
Les nœuds document constituent la racine de l’arborescence. Ils ne sont représentés ni visuellement ni textuellement dans le document XML. Il s’agit d’un nœud de conception qui comprend tous les autres éléments du document. Les éléments enfant du nœud document sont l’élément racine ainsi que, le cas échéant, les nœuds instruction de traitement et les nœuds commentaire.
Nœuds attribut (attribute node)
Dans le modèle de données XPath, les attributs d’un élément XML sont représentés sous la forme de nœuds attribut. Chaque nœud attribut est composé d’un marqueur et d’une valeur affectée à l’attribut.
Dans l’exemple de code, le premier nœud élément book contient le nœud attribut isbn avec la valeur 9781408845660.
<book isbn="9781408845660">
Les nœuds attribut sont considérés comme appartenant au nœud élément, mais pas comme des éléments enfant de l’élément.
Nœuds texte (text node)
Les données de caractère dans les balises de début et de fin d’un nœud élément sont appelées des nœuds texte.
Dans l’exemple de code, le nœud élément title contient le nœud texte Harry Potter et le prisonnier d’Azkaban.
Harry Potter et le prisonnier d’Azkaban
Nœuds espace de noms
Dans les documents XML bien structurés, tous les noms d’éléments et d’attributs utilisés sont affectés à un espace de noms. Cette affectation est généralement déjà effectuée dans la définition du type de document au début du document.
Si des éléments ou des attributs d’espaces de noms différents sont utilisés dans un document XML, l’espace de noms correspondant sera défini explicitement dans la balise de début de l’élément concerné à l’aide de l’attribut xmlns ou du préfixe xmlns. L’attribut xmlns attend comme valeur un Uniform Resource Identifier (URI) indiquant à quel espace de noms l’élément correspondant est affecté. L’affectation d’un espace de noms à un préfixe xmlns est à la disposition de l’élément et de tous les éléments enfant. Chaque espace de noms correspond à un nœud espace de noms dans l’arborescence.
Dans l’exemple de code, deux espaces de noms ont été définis pour l’élément XML address : xmlns:shipping et xmlns:billing. Les éléments enfant de l’élément address indiquent l’affectation correspondante sous forme de préfixe.
<address xmlns:shipping="http://localhost/XML/delivery" xmlns:billing="http://localhost/XML/ billing">
<shipping:name>Ellen Adams</shipping:name>
<shipping:street>123 Maple Street</shipping:street>
<shipping:city>Mill Valley</shipping:city>
<shipping:state>CA</shipping:state>
<shipping:zip>10999</shipping:zip>
<shipping:country>États-Unis</shipping:country>
<billing:name>Mary Adams</billing:name>
<billing:street>8 Oak Avenue</billing:street>
<billing:city>Old Town</billing:city>
<billing:state>PA</billing:state>
<billing:zip>95819</billing:zip>
<billing:country>États-Unis</billing:country>
</address>
Le préfixe xmlns permet d’affecter de façon claire des éléments de même nom issus de différents espaces de noms. L’élément street avec le préfixe shipping contient par exemple la rue de l’adresse de livraison tandis que l’élément street avec le préfixe billing contient la rue de l’adresse de facturation.
Nœuds instruction de traitement (processing instruction node)
Dans les documents XML, les instructions de traitement sont situées en dehors de l’arbre du document et sont appelés nœuds instruction de traitement dans la terminologie XPath. Un nœud instruction de traitement commence par <? et se termine par ?>.
Dans l’exemple de code ci-dessus, vous trouverez l’instruction de traitement suivante :
<?xml-stylesheet type="text/css" href="style.css"?>
La déclaration XML au début du fichier XML reprend la syntaxe d’une instruction de traitement, mais n’est pas considérée comme un nœud instruction de traitement au sens du modèle de données XPath.
Nœuds commentaire (comment node)
Dans un document XML, les contenus marqués comme commentaires sont traités par XPath comme des nœuds commentaire. Le nœud contient uniquement le contenu des caractères marqués, pas le balisage.
Dans l’exemple de code ci-dessus, vous trouverez les nœuds commentaire suivants :
Ceci est un commentaire!
Chemins de localisation
L’adressage de nœuds est effectué à l’aide de chemins de localisation. Les chemins de localisation sont une expression XPath utilisée pour naviguer dans l’arborescence et sélectionner l’ensemble de nœuds souhaité. L’ensemble de nœuds est le résultat d’une expression XPath.
Les chemins de localisation sont analysés de gauche à droite. On distingue les chemins de localisation absolus et relatifs. Un chemin de localisation absolu commence au nœud document. Dans ce cas, faites précéder l’expression XPath d’une barre oblique (/). Les chemins de localisation relatifs commencent à n’importe quel nœud de l’arborescence. Ce point de départ est appelé nœud de contexte.
Un chemin de localisation est composé de différentes étapes de localisation qui sont séparées par des barres obliques (/), de façon analogue à l’adressage de fichiers dans des systèmes de répertoires.
Chaque étape de localisation d’un chemin peut comporter jusqu’à trois parties : l’axe, le test de nœud et un nombre de prédicats au choix.
- Axe : le choix de l’axe permet de déterminer le sens de la navigation dans l’arborescence en partant du nœud contexte ou du nœud document.
- Test de nœud : le test de nœud correspond à un filtre permettant de restreindre les nœuds situés sur l’axe à l’ensemble de nœuds souhaité.
- Prédicats : les prédicats vous permettent de filtrer à nouveau les nœuds sélectionnés à travers l’axe et le test de nœud.
Les étapes de localisation d’une expression XPath sont notées selon la syntaxe suivante :
axe::testdenœud[prédicat1][prédicat2]…
Notation | Fonction |
---|---|
/ | Fonctionne comme un séparateur de chemin entre deux étapes de localisation |
:: | Fonctionne comme un séparateur de chemin entre l’axe et le test de nœud |
Axes
La syntaxe XPath permet de naviguer à l’aide des axes suivants.
Axe | Dénomination française | Nœuds sélectionnés |
---|---|---|
child | enfant | Tous les nœuds enfant directement subordonnés |
parent | nœud parent | Le nœud parent directement supérieur |
descendant | descendant | Tous les nœuds subordonnés |
ancestor* | ancêtre | Tous les nœuds supérieurs |
following | nœuds suivants | Tous les nœuds suivants dans la séquence de document à l’exception des descendants |
preceding* | nœuds précédents | Tous les nœuds précédents dans la séquence de document à l’exception des ancêtres |
following-sibling | nœuds frère suivants | Tous les nœuds suivants dans le document XML provenant du même nœud parent |
preceding-sibling* | nœud frère précédent | Tous les nœuds précédents dans le document XML provenant du même nœud parent |
attribute | attribut | Tous les nœuds attribut d’un nœud élément |
namespace | espace de noms | Tous les nœuds espace de noms d’un nœud élément ; à partir de la version 2.0, cet axe ne figure plus dans la spécification. |
self | nœud courant | Le nœud de contexte à proprement parler |
descendant-or-self | descendant, y compris le nœud courant | Tous les nœuds subordonnés, y compris le nœud de contexte |
ancestor-or-self* | ancêtres ou nœud courant | Tous les nœuds supérieurs, y compris le nœud de contexte |
Les axes marqués d’un astérisque (*) sont des applications orientées dans le sens inverse, qui, conformément à la spécification XPath version 1.0, sont facultatives et ne doivent pas nécessairement être supportées par les applications répondant au standard.
Le schéma suivant vous présente les principaux axes du modèle de données XPath en partant du nœud de contexte (en rouge).
L’axe child:: sélectionne par exemple tous les éléments enfant du nœud de contexte D : l’ensemble de nœuds comprend les nœuds E, H et I.
Test de nœud
Le test de nœud vous permet de définir un filtrage pour l’ensemble de nœuds sélectionné avec l’axe. Deux critères de filtrage sont possibles conformément à la spécification XPath.
- Nom du nœud : indiquez un nom de nœud en tant que test de nœud afin de sélectionner tous les nœuds portant le nom correspondant sur l’axe sélectionné.
- Type de nœud : indiquez un type de nœud en tant que test de nœud afin de sélectionner tous les nœuds disposant du type correspondant sur l’axe sélectionné.
Nom du nœud en tant que critère de filtrage
En nous basant sur l’exemple de code ci-dessus, le chemin de localisation suivant vous permettrait par exemple de sélectionner tous les descendants avec le nom book en partant du nœud document.
/descendant::book
En revanche, si vous souhaitez filtrer l’attribut isbn pour tous les nœuds élément portant le nom book, vous aurez besoin d’un chemin de localisation avec deux étapes de localisation.
<p>/descendant::book/attribute::isbn</p>
Type de nœud comme critère de filtrage
Si vous souhaitez définir un type de nœud comme critère de filtrage pour la sélection de l’ensemble de nœuds, utilisez l’une des fonctions suivantes comme test de nœud :
Fonction | Nœuds sélectionnés |
---|---|
node() | La fonction node() sélectionne tous les nœuds sur l’axe sélectionné. |
text() | La fonction text() sélectionne tous les nœuds texte sur l’axe sélectionné. |
comment() | La fonction comment() sélectionne tous les nœuds commentaire sur l’axe sélectionné. |
processing-instruction() | La fonction processing-instruction() sélectionne tous les nœuds instruction de traitement sur l’axe sélectionné. |
XPath 1.0 définissait déjà 25 fonctions. Depuis XPath 2.0, 111 fonctions sont disponibles pour décrire les chemins de localisation. Vous trouverez une vue d’ensemble de ces fonctions dans la recommandation W3C XPath and XQuery Functions and Operators 3.1 du 21 mars 2017.
Test de nœud avec Wildcard
Si à la place du test de nœud, vous utilisez le caractère * (astérisque), vous sélectionnerez tous les nœuds correspondant au type de nœud principal de l’axe sélectionné. Dans un tel cas, si un axe contient des nœuds élément, ce type de nœud est le type de nœud principal de l’axe. Il en va de même de tous les axes à l’exception des axes attribute et namespace. Dans ces deux cas, les nœuds attribut et les nœuds espace de noms sont le type de nœud principal.
Le chemin de localisation suivant indique par exemple tous les attributs du nœud de contexte courant :
attribute::*
Notation abrégée
Des abréviations, qui peuvent être utilisées à la place des désignations anglaises dans l’expression XPath, ont été définies pour les axes et les étapes de localisation utilisés fréquemment.
Notation standard | Abréviation | Exemple |
---|---|---|
child:: | vide | child est l’axe standard. La désignation de l’axe peut être omise si nécessaire. Le chemin de localisation child::book/child::title correspond ainsi à la forme abrégée book/title. |
attribute:: | @ | L’axe attribute, incluant le séparateur, peut être abrégé à l’aide du caractère @.Le chemin de localisation book/attribute::isbn sélectionne le nœud attribut isbn de l’élément book et correspond à la notation abrégée book/@isbn. |
/descendant-or-self::node()/ | // | L’étape de localisation /descendant-or-self::node()/ sélectionne le nœud document et tous les descendants ; il est abrégé avec //. Au lieu d’écrire /descendant-or-self::node()/child::item, on peut abréger cette expression en //item. Le chemin de localisation sélectionne tous les nœuds item du document. |
parent::node() | .. | L’étape de localisation parent::node() sélectionne le nœud parent du nœud de contexte et est abrégée en .. . |
self::node() | . | L’étape de localisation self::node() sélectionne le nœud de contexte courant et est abrégée en . . |
Prédicats
Les prédicats vous permettent de définir d’autres critères de filtrage pour l’ensemble de nœuds sélectionné avec l’axe et le test de nœud.
Ils constituent la troisième partie facultative d’une étape de localisation et sont notés dans des crochets. Les critères de filtrage dans les crochets sont formulés comme des expressions pouvant notamment contenir des expressions de chemin, des fonctions, des opérateurs et des chaînes.
La syntaxe XPath supporte les prédicats généraux et les prédicats numériques.
Prédicats généraux
Les expressions dans les prédicats généraux permettent le filtrage de l’ensemble de nœuds sélectionné avec l’axe et le test de nœud en indiquant pour chaque nœud de la sélection une valeur booléenne (true ou false). Tous les nœuds avec la valeur true sont inclus au résultat.
La formulation des expressions pour les prédicats généraux est effectuée à l’aide d’opérateurs. Ces derniers sont utilisés afin de sélectionner des nœuds ciblés avec des propriétés et des contenus particuliers, par exemple, tous les nœuds contenant une chaîne de caractères donnée, une valeur d’attribut ou un élément enfant précis (le cas échéant, à une certaine position).
Les tableaux suivants vous donnent un aperçu des opérateurs disponibles. On distingue les opérateurs arithmétiques, les opérateurs logiques et les opérateurs de comparaison.
Opérateurs arithmétiques | Fonction |
---|---|
+ | Addition |
- | Soustraction |
* | Multiplication |
div | Division en virgule flottante |
mod | Modulo |
Opérateurs de comparaison | Fonction |
---|---|
= | égal à |
!= | différent de |
< | plus petit que ; masquage nécessaire au sein de XSLT (<) |
> | plus grand que ; masquage recommandé au sein de XSLT (>) |
<= | plus petit que ou égal à ; masquage nécessaire au sein de XSLT (<) |
>= | plus grand que ou égal à ; masquage recommandé au sein de XSLT (>) |
Opérateurs logiques | Fonction |
---|---|
and | lien logique et |
or | lien logique ou |
Dans l’exemple suivant, le prédicat [title="Harry Potter et le prisonnier d’Azkaban"] restreint l’ensemble de données à un nœud élément nommé book dont l’élément enfant title contient la chaîne Harry Potter et le prisonnier d’Azkaban.
L’exemple correspond à la syntaxe XPath-3 qui peut ne pas être supportée par tous les outils en ligne. Les requêtes présentées ici peuvent par exemple être suivies à l’aide de l’outil de test en ligne suivant : http://videlibri.sourceforge.net/cgi-bin/xidelcgi.
/order/items/book[title="Harry Potter et le prisonnier d’Azkaban"]
Nous avons à présent sélectionné le nœud élément book qui contient les données pour le livre Harry Potter.
<book isbn="9781408845660">
<title>Harry Potter et le prisonnier d’Azkaban</title>
<quantity>1</quantity>
<priceus>22.94</priceus>
<comment>Veuillez confirmer la date de livraison avant Noël.</comment>
</book>
L’élément comment est un autre élément enfant de ce nœud élément. Si nous souhaitons sélectionner son contenu, le chemin de localisation doit être uniquement complété par deux étapes de localisation.
/order/items/book[title="Harry Potter et le prisonnier d’Azkaban"]/comment/text()
Avec l’étape de localisation comment (abréviation de child::comment), nous naviguons jusqu’à l’élément enfant du même nom de l’élément book et nous sélectionnons son nœud texte avec la fonction text(). Il correspond à la chaîne suivante :
Veuillez confirmer la date de livraison avant Noël.
Si une seule expression de chemin est utilisée dans un prédicat, on parle de test d’existence. Le chemin de localisation suivant permet par exemple de tester si le document XML détaillé ci-dessus contient un ou plusieurs nœuds intitulés comment.
Notation abrégée :
//book[comment]
Notation standard :
/descendant-or-self::node()/child::book[child::comment]
Le chemin de localisation //book[comment] sélectionne tous les nœuds portant le nom book ayant un élément enfant portant le nom comment.
Prédicats numériques
Les prédicats numériques vous permettent d’adresser des nœuds à l’aide de leur position. Le chemin de localisation suivant sélectionne par exemple le deuxième nœud dans la séquence du document dont le nom est book :
//book[2]
Pour être précis, le prédicat [2] est la forme abrégée de [position()=2]. XPath sélectionne ainsi tout d’abord l’ensemble des nœuds portant le nom « book » et filtre ensuite le nœud pour lequel la fonction position()=2 renvoie la valeur booléenne true.
Contrairement à d’autres langages de programmation, l’énumération XPath commence avec 1.
Informations complémentaires concernant le XML Path Language
Une vue d’ensemble du niveau de développement actuel du XML Path Language ainsi que tous les standards et les projets officiels est disponible sur le site Internet de W3C.
Des informations et des outils gratuits concernant l’utilisation de XPath dans le cadre des applications web sont à votre disposition dans les MDN-Web-Docs ainsi que dans le Microsoft Developer Network.