OUJOOD.COM
Introduction aux Axes XPath
Les axes de recherche XPath constituent l'un des concepts fondamentaux pour interroger et naviguer dans des documents XML. Un axe définit une relation de navigation entre le nœud de contexte actuel et un ensemble de nœuds cibles dans l'arborescence XML. Chaque axe permet de parcourir le document selon une direction spécifique : vers les ancêtres, les descendants, les frères et sœurs, ou d'autres relations hiérarchiques.
Cette page explore en détail les 13 axes standard de XPath, leur syntaxe précise, et leurs applications pratiques dans des scénarios réels de traitement de données XML. Vous apprendrez à construire des expressions XPath complexes en combinant axes, tests de nœuds et prédicats pour extraire exactement les informations dont vous avez besoin.
Document XML d'Exemple pour les Démonstrations
Document XML de référence utilisé dans ce tutoriel XPathPour illustrer concrètement l'utilisation des axes XPath dans des requêtes réelles, nous utiliserons le document XML suivant tout au long de cette page. Ce document représente un catalogue de produits avec des livres et articles, incluant des attributs, des nœuds de texte et des commentaires pour couvrir tous les types de sélections possibles.
<?xml version="1.0" encoding="UTF-8"?> <!-- Document XML représentant un catalogue de produits --> <stock> <livre> <title lang="eng">Harry Potter</title> <prix>29.99</prix> <auteur>J.K. Rowling</auteur> </livre> <livre> <title lang="eng">Learning XML</title> <prix>39.95</prix> <auteur>Erik T. Ray</auteur> </livre> <produit> <nom>Livre</nom> <prix monnaie="Francs">50</prix> <comment>Un commentaire descriptif</comment> </produit> <produit> <nom>CD</nom> <prix monnaie="Euros">23</prix> </produit> <!-- Commentaire XML dans le document --> </stock>
Les 13 Axes de Recherche XPath Expliqués
XPath définit 13 axes différents pour naviguer dans l'arbre XML. Chaque axe représente une direction de navigation spécifique par rapport au nœud de contexte. Comprendre ces axes est essentiel pour écrire des requêtes XPath efficaces et performantes.
Un axe XPath détermine l'ensemble des nœuds accessibles à partir du nœud actuel selon une relation hiérarchique ou positionnelle donnée. La maîtrise de ces axes permet de créer des sélecteurs XML précis sans avoir à parcourir l'ensemble du document.
| Nom de l'Axe | Traduction Française | Description et Résultat |
|---|---|---|
| ancestor | ancêtre | Sélectionne tous les nœuds ancêtres (parent, grand-parent, arrière-grand-parent, etc.) du nœud actuel jusqu'à la racine du document, en remontant la hiérarchie XML |
| ancestor-or-self | ancêtre-ou-soi-même | Sélectionne tous les nœuds ancêtres du nœud actuel (parent, grand-parent, etc.) ainsi que le nœud actuel lui-même, utile pour inclure le contexte dans la sélection |
| attribute | attribut | Sélectionne tous les attributs XML du nœud actuel. Cet axe ne retourne que les attributs, jamais les nœuds enfants ou autres types de nœuds |
| child | enfant | Sélectionne tous les nœuds enfants directs du nœud actuel. C'est l'axe par défaut utilisé lorsqu'aucun axe n'est spécifié explicitement dans une expression XPath |
| descendant | descendant | Sélectionne tous les nœuds descendants (enfants, petits-enfants, arrière-petits-enfants, etc.) du nœud actuel à tous les niveaux de profondeur |
| descendant-or-self | descendant-ou-soi-même | Sélectionne tous les nœuds descendants du nœud actuel (à tous les niveaux) ainsi que le nœud actuel lui-même, pratique pour des recherches inclusives |
| following | suivant | Sélectionne tous les nœuds qui apparaissent après la balise de fermeture du nœud actuel dans le document XML, en ordre de document, excluant les descendants |
| following-sibling | frère-suivant | Sélectionne tous les nœuds frères et sœurs qui suivent le nœud actuel et qui partagent le même parent, dans l'ordre du document |
| namespace | espace-de-noms | Sélectionne tous les nœuds d'espace de noms (namespace) déclarés pour le nœud actuel, utilisé dans les documents XML avec namespaces multiples |
| parent | parent | Sélectionne le nœud parent direct du nœud actuel. Il ne peut y avoir qu'un seul parent pour chaque nœud (sauf la racine qui n'en a pas) |
| preceding | précédant | Sélectionne tous les nœuds qui apparaissent avant la balise d'ouverture du nœud actuel dans le document, en ordre inverse, excluant les ancêtres |
| preceding-sibling | frère-précédent | Sélectionne tous les nœuds frères et sœurs qui précèdent le nœud actuel et qui partagent le même parent, dans l'ordre inverse du document |
| self | soi-même | Sélectionne le nœud de contexte actuel lui-même, utile dans certaines expressions complexes ou pour des tests conditionnels |
Syntaxe des Expressions de Chemin XPath
Une expression de chemin XPath permet de localiser précisément des nœuds dans un document XML. Ces chemins peuvent être absolus ou relatifs, chaque approche ayant ses avantages selon le contexte d'utilisation.
Chemins Absolus versus Chemins Relatifs
Un chemin XPath absolu commence toujours par une barre oblique (/) et part de la racine du document XML. À l'inverse, un chemin XPath relatif ne commence pas par / et s'évalue à partir du nœud de contexte actuel. Cette distinction est cruciale pour construire des requêtes adaptées à votre situation.
|
Chemin absolu XPath :
Exemple : Chemin relatif XPath :
Exemple : |
Structure d'une Étape de Localisation
Chaque étape (step) dans un chemin XPath est évaluée séquentiellement pour l'ensemble de nœuds dans le contexte actuel. Une étape complète se compose de trois éléments fondamentaux :
- Un axe de navigation : définit la direction de recherche dans l'arborescence (ancestor, child, descendant, following, etc.) et établit la relation entre les nœuds sélectionnés et le nœud de contexte
- Un test de nœud : identifie le type ou le nom des nœuds à sélectionner dans l'axe spécifié (nom d'élément,
text(),node(),*, etc.) - Zéro ou plusieurs prédicats (filtres entre crochets
[]) : affinent davantage l'ensemble de nœuds sélectionné en appliquant des conditions supplémentaires
La syntaxe formelle d'une étape de localisation XPath suit ce modèle :
axisname::nodetest[predicate1][predicate2]... Exemple : |
Exemples Pratiques d'Utilisation des Axes XPath
Le tableau suivant présente des exemples concrets d'utilisation de chaque axe XPath avec des explications détaillées de leur fonctionnement dans le contexte de notre document XML d'exemple.
| Expression XPath avec Axe | Résultat et Explication |
|---|---|
| child::livre | Sélectionne tous les éléments livre enfants directs du nœud actuel. Si le contexte est /stock, retourne les deux éléments <livre> |
| attribute::lang | Sélectionne l'attribut lang du nœud actuel. Équivalent à @lang. Si le contexte est un élément <title>, retourne l'attribut lang="eng" |
| child::* | Sélectionne tous les éléments enfants du nœud actuel, quel que soit leur nom. Le wildcard * correspond à n'importe quel nom d'élément |
| attribute::* | Sélectionne tous les attributs du nœud actuel, indépendamment de leurs noms. Utile pour traiter tous les attributs d'un élément |
| child::text() | Sélectionne tous les nœuds de texte enfants du nœud actuel. Retourne uniquement le contenu textuel, pas les éléments enfants |
| child::node() | Sélectionne tous les types de nœuds enfants : éléments, texte, commentaires, instructions de traitement, etc. |
| descendant::livre | Sélectionne tous les éléments livre descendants à n'importe quel niveau de profondeur sous le nœud actuel, incluant enfants, petits-enfants, etc. |
| ancestor::livre | Sélectionne tous les éléments livre ancêtres du nœud actuel en remontant la hiérarchie jusqu'à la racine |
| ancestor-or-self::livre | Sélectionne tous les ancêtres livre du nœud actuel, et inclut également le nœud lui-même s'il s'agit d'un élément <livre> |
| child::*/child::prix | Sélectionne tous les éléments prix petits-enfants du nœud actuel. Cette expression traverse deux niveaux : d'abord les enfants (quelconques), puis leurs enfants nommés prix |
Exemple Pratique avec Code Commenté
Voici une démonstration concrète d'utilisation des axes XPath en JavaScript pour extraire des données du document XML :
// Chargement et parsing du document XML var xmlDoc = parser.parseFromString(xmlString, "text/xml"); var root = xmlDoc.documentElement; // Utilisation de l'axe child pour sélectionner les livres var livres = xmlDoc.evaluate("child::livre", root, null, XPathResult.ANY_TYPE, null); // Utilisation de l'axe descendant pour tous les prix var tousPrix = xmlDoc.evaluate("descendant::prix", root, null, XPathResult.ANY_TYPE, null); // Utilisation de l'axe following-sibling var premierLivre = xmlDoc.evaluate("child::livre[1]", root, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; var freresSuivants = xmlDoc.evaluate("following-sibling::*", premierLivre, null, XPathResult.ANY_TYPE, null); // Parcours des résultats var node = tousPrix.iterateNext(); while (node) { console.log("Prix trouvé : " + node.textContent); node = tousPrix.iterateNext(); }
Filtrage Avancé des Nœuds avec XPath
Les fonctions de test de nœuds XPath permettent d'affiner vos sélections en filtrant les types de nœuds retournés. Ces fonctions sont essentielles pour construire des requêtes XPath professionnelles et précises.
Fonction node() - Sélection de Tous Types de Nœuds
Syntaxe : node()
La fonction node() sélectionne tous les types de nœuds dans l'axe spécifié, à l'exception du nœud racine du document. Elle retourne les éléments, les nœuds de texte, les commentaires et les instructions de traitement.
/* Sélectionne tous les nœuds enfants de produit, incluant éléments, texte et commentaires */ /stock/produit/node() /* Pour le premier produit, retourne : - nœud élément <nom> - nœud élément <prix> - nœud élément <comment> - nœuds texte entre les balises */
Fonction id() - Sélection par Identifiant
Syntaxe : id(label)
La fonction id() permet de sélectionner directement un nœud repéré par un identifiant unique (attribut de type ID dans la DTD ou le schéma XML). C'est la méthode la plus rapide pour accéder à un nœud spécifique.
/* Sélectionne le nœud ayant l'ID 'CD', puis accède à son élément prix enfant */ id('CD')/prix /* Équivalent à naviguer directement vers le nœud sans parcourir l'arborescence */
Prédicats et Conditions dans les Expressions XPath
Les prédicats XPath (conditions entre crochets) constituent le mécanisme de filtrage le plus puissant pour affiner vos sélections. Ils permettent de définir des critères complexes de sélection de nœuds basés sur l'existence, la position ou des comparaisons de valeurs.
Rappel syntaxique : Les sélecteurs de nœuds suivent la forme générale :
axe::filtre[condition1][condition2][condition3]...
Conditions d'Existence de Nœuds
Une condition d'existence XPath est vraie si l'expression retourne un ensemble non vide de nœuds. C'est la forme de prédicat la plus simple et très utilisée en pratique.
/* Sélectionne les produits qui possèdent un élément prix avec un attribut monnaie */ /stock/produit[prix/attribute::monnaie] /* Forme alternative équivalente avec notation abrégée */ /stock/produit[prix[@monnaie]] /* Résultat : les deux éléments produit car ils ont tous les deux l'attribut monnaie sur leur prix */ /* Autre exemple : produits avec commentaire */ /stock/produit[comment] /* Retourne uniquement le premier produit car il possède un élément <comment> */
Conditions de Position dans le Contexte
Les prédicats de position XPath utilisent des numéros pour sélectionner des nœuds selon leur rang dans l'ensemble de nœuds du contexte actuel. La position commence à 1 (pas à 0 comme en programmation).
/* Première expression : teste d'abord la position, puis vérifie l'existence de comment */ produit[2][comment] /* Signification : "le 2ème produit, SI il a un comment" Retourne vide car le 2ème produit n'a pas de comment */ /* Deuxième expression : teste d'abord l'existence, puis sélectionne par position */ produit[comment][2] /* Signification : "le 2ème produit PARMI ceux qui ont un comment" Retourne également vide car un seul produit a un comment */ /* Exemple supplémentaire : dernier élément */ produit[last()] /* Sélectionne le dernier produit dans la liste */ /* Exemple : premier livre avec prix > 30 */ livre[prix > 30][1]
Conditions Logiques et Opérateurs de Comparaison
Les conditions logiques XPath permettent d'effectuer des comparaisons entre valeurs de nœuds et d'utiliser des opérateurs booléens pour combiner plusieurs critères. Ces conditions sont évaluées en utilisant les opérateurs de comparaison : =, !=, <, <=, >, >=.
/* (1) Égalité stricte : produits avec prix égal à 100 */ produit[prix = 100] /* Retourne les produits dont le prix vaut exactement 100 */ /* (2) Inégalité : produits avec prix différent de 100 */ produit[prix != 100] /* Retourne les produits dont le prix est autre que 100 */ /* (3) Comparaison relative : produits moins chers que le prix maximum du catalogue */ produit[prix < /stock/produit/prix] /* Cette expression retourne tous les produits sauf celui(ceux) ayant le prix le plus élevé */ /* (4) Opérateur AND : combinaison de conditions */ produit[prix > 10 and comment] /* Sélectionne les produits avec prix supérieur à 10 ET possédant un élément comment */ /* (5) Opérateur OR : alternative entre conditions */ produit[prix < 20 or nom = 'CD'] /* Retourne les produits peu chers OU nommés 'CD' */ /* (6) Négation avec NOT : inversion de condition */ produit[not(prix != 100)] /* Équivalent à : tous les produits où le prix égale 100 La double négation not(!=) devient une égalité */ /* (7) Conditions complexes imbriquées */ livre[(prix > 30 and @lang='eng') or auteur='J.K. Rowling'] /* Livres en anglais coûtant plus de 30€ OU écrits par J.K. Rowling */
Exemples Avancés de Combinaison d'Axes et Prédicats
Voici des exemples pratiques de requêtes XPath complexes combinant plusieurs concepts pour des sélections sophistiquées :
/* Sélection avec axe descendant et condition */ /stock/descendant::prix[@monnaie='Euros'] /* Trouve tous les prix en Euros à n'importe quel niveau sous l'élément stock */ /* Utilisation de following-sibling avec prédicat */ //livre[1]/following-sibling::livre[prix > 30] /* Après le premier livre, trouve les livres frères dont le prix dépasse 30 */ /* Combinaison d'axes ancestor et child */ //prix/ancestor::produit/child::nom /* Pour chaque élément prix, remonte à son produit parent puis sélectionne l'élément nom enfant */ /* Requête avec fonction count() */ /stock/*[count(prix) > 0] /* Sélectionne les enfants de stock ayant au moins un élément prix */ /* Navigation complexe avec plusieurs prédicats */ /stock/livre[position() < 3][prix < 35][title/@lang] /* Livres : parmi les 2 premiers, prix < 35, ayant un attribut lang sur le title */
Notations Abrégées XPath Couramment Utilisées
XPath propose des syntaxes abrégées qui simplifient l'écriture des expressions courantes. Ces raccourcis rendent le code plus lisible tout en conservant la même fonctionnalité.
| Notation Abrégée | Forme Complète | Explication |
|---|---|---|
| @attribut | attribute::attribut | Raccourci pour l'axe attribute |
| . | self::node() | Représente le nœud de contexte actuel |
| .. | parent::node() | Représente le nœud parent |
| // | /descendant-or-self::node()/ | Sélection depuis la racine à tous niveaux |
| element | child::element | L'axe child est implicite par défaut |
Bonnes Pratiques pour les Requêtes XPath Performantes
Pour écrire des expressions XPath efficaces et maintenables, suivez ces recommandations professionnelles :
- Utilisez des chemins spécifiques : préférez
/stock/livre/prixà//prixquand la structure est connue, pour optimiser les performances - Évitez les axes coûteux : les axes
precedingetfollowingpeuvent être lents sur de gros documents, utilisez-les judicieusement - Combinez les prédicats intelligemment : placez les conditions les plus restrictives en premier pour réduire rapidement l'ensemble de nœuds
- Exploitez les index : utilisez la fonction
id()quand des identifiants sont disponibles pour un accès direct - Testez vos expressions : validez vos requêtes XPath avec des outils comme XPath tester avant de les intégrer
- Documentez les expressions complexes : ajoutez des commentaires pour expliquer la logique des requêtes sophistiquées
| Cours précédent : Syntaxe XPath |
Sommaire : Le Langage XML |
Cours suivant : Opérateurs et Fonctions XPath |
Par carabde | Mis à jour le 27 janvier 2026