Vous êtes sur la page 1sur 47

Le Langage XPath

Pr. Sidi Mohammed Benslimane


École Supérieure en Informatique
08 Mai 1945 – Sidi Bel Abbes –

s.benslimane@esi-sba.dz
XPath, c’est quoi?
• Xpath est une spécification du W3C, dont la version 1.0 est
recommandée en Novembre 1999.
• XPath est un langage non XML utilisé pour extraire des
informations à partir de documents XML.
• Xpath permet de désigner (d’identifier) un ou plusieurs
noeuds dans un arbre XML, à l’aide de certains critères
appelés les expressions de chemin.
• Sa syntaxe élémentaire ressemble à l'expression d'un chemin
dans un SGF.
• Xpath est la brique de base pour d'autres technologies XML :
 XSLT : langage de transformation ;
 XQuery : langage de requêtes;
 XLink : spécification des hyperliens ;
 WS-BPEL: langage de composition de services Web.
Modèle de données XPath
• Un document XML est représenté par une
structure hiérarchique en arbre qui comprend 7
types de nœuds:
1. nœud racine "/"
2. nœuds d’élément,
3. nœuds de texte,
4. nœuds d’attribut,
5. nœuds d’espace de noms,
6. nœuds de commentaire,
7. nœuds d’instruction de traitement.
Modèle de données XPath
• Les enfants du noeud racine sont ses noeuds
fils de type commentaire ou instruction de
traitement.
• Les enfants d’un noeud élément sont ses
noeuds fils de type élément, texte,
commentaire ou instruction de traitement.
• Les descendants du noeud racine ou d’un
noeud élément sont ses enfants ou les enfants
de ses enfants.
Chemin de localisation XPath
• Un chemin ou une expression Xpath est une
construction récursive constituée d’étapes
séparées par "/".
• Syntaxe d'un chemin : [/]étape1/étape2/…/étapeN
• Une expression XPath peut être relative ou
absolue (comme une URL):
– Si elle commence par "/": absolue depuis la racine,
Exemple: /Livre/editeur/nom
– Sinon: relative au nœud "courant "
Exemple: Livre/editeur/nom
Étape de localisation XPath
• Une étape est composée de trois parties. Elle a la forme:
[axe::]filtre[predicat1] [predicat2]…[predicatN]

• L’axe : détermine le sens du parcours des noeuds;


• Le filtre: indique le type des noeuds qui seront
retenus dans l‘évaluation de l'expression
• Les prédicats: expriment les propriétés que
doivent satisfaire les noeuds retenus.
• Les parties axe et prédicats sont optionnelles.
Les axes de recherche
• Un axe sélectionne, dans l’arbre du document et à partir
du nœud courent, l’ensemble des noeuds qui peuvent
être atteints en suivant une certaine direction :
1. Les axes en avant
2. Les axes en arrière
3. Les axes à droite et à gauche
4. Les axes avant et après
5. Les axes pour les attributs
Les axes de recherche: Les axes en avant
Les axes qui permettent de descendre dans l’arbre :

• Self: le noeud courant,


• Child: Les fils du noeud courant, sauf les
attributs (c’est l’axe par défaut).
• Descendant: les descendants du noeud courant
• Descendant-or-self: les descendants du noeud
courant plus lui-même.
/ E -- Comment()
Cours

E T Text()
Titre

E E T Text()
Auteur Nom

E T Text()
Prénom
Axe Self
E T Text()

Description
<Cours>
<!--ceci un est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
/ E -- Comment()
Cours

E T Text()
Titre

E E T Text()
Auteur Nom

Axe Child E T Text()


Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
/ E -- Comment()
Cours

E T Text()
Titre

E E T Text()
Auteur Nom

Axe Descendant E T Text()


Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
/ E -- Comment()
Cours

E T Text()
Titre

E E T Text()
Auteur Nom

Axe Descendant-or-self E T Text()


Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
Les axes de recherche: Les axes en arrière
Les axes qui permettent de remonter dans l’arbre :

• Parent: le noeud parent du noeud courant,


• Ancestor: les ascendants du noeud courant
• Ancestor-or-self: les ascendants du noeud
courant plus lui-même.
/ E -- Comment()
Cours

E T Text()
Titre
Axe Parent
E E T Text()
Auteur Nom

E T Text()
Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
/ E -- Comment()
Cours
Axe Ancestor
E T Text()
Titre

E E T Text()
Auteur Nom

E T Text()
Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
/ E -- Comment()
Cours

E T Text()
Titre

E E T Text()
Auteur Nom
Axe Ancestor-or-self
E T Text()
Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
Les axes de recherche: Les axes à droite et
à gauche
• Following-sibling: les noeuds frères placés après
le noeud courant (partageant le même père).

• Preceding-sibling: les noeuds frères placés


avant le noeud courant (partageant le même
père).
/ E -- Comment()
Cours

E T Text()
Titre

E E T Text()
Auteur Nom
Axe Following-sibling
E T Text()
Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
/ E -- Comment()
Cours

E T Text()
Titre
Axe Preceding-sibling
E E T Text()
Auteur Nom

E T Text()
Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
Les axes de recherche: Les axes avant et après
• Following: les nœuds placés après dans le
document (excepté ses descendants ainsi que les
noeuds attributs).

• Preceding: les nœuds placés avant dans le


document (excepté ses ancêtres ainsi que les
noeuds attributs).
/ E -- Comment()
Cours

E T Text()
Titre

E E T Text()
Auteur Nom
Axe Following
E T Text()
Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
/ E -- Comment()
Cours

E T Text()
Titre
Axe Preceding
E E T Text()
Auteur Nom

E T Text()
Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
Les axes de recherche: Les axes pour les attributs

• Attribute: sélectionne les noeuds de type


attribut, fils du nœud courant (si le noeud
contexte n’est pas un élément, cet axe est vide) ;
/ E -- Comment()

Cours Soutitre @
E T Text()
Axe attribute Titre

E E T Text()
Auteur Nom

E T Text()
Prénom

E T Text()

Description
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre soutitre=’XPath’>Cours XML</Titre> b
<Auteur>
T Text()
<Nom>Benslimane</Nom>
<Prénom>Sidi Med</Prénom>
-- Comment()
</Auteur>
<Description>
Ce cours aborde les <b>concepts</b>
de base dans XPath.
<!-- c'est le meilleur cours !!! -->
</Description>
</Cours>
Les filtres (test de nœuds)
[axe::]filtre[predicat1] [predicat2]…[predicatN]

• Un filtre ou test de noeud sélectionné parmi les noeuds de l’axe a


l’une des formes suivante:
• nom : sélectionne les noeuds de l’axe qui portent ce nom;
• * : dans l'axe des attributs, tout attribut, dans les autres axes,
tout element;
• node() : sélectionne tout noeud de l’axe sauf la racine,
• text() : sélectionne tout noeud de l’axe de type texte ;
• comment() : sélectionne tout noeud de l’axe de type
commentaire;
• @nomAttrib : nœuds attributs avec "nomAttrib" comme
nom d’attribut.
/Cours/Auteur/*/text()

/ E -- Comment()

Cours Soutitre @
/Cours/Titre/@soutitre
E T Text()
Titre
/Cours/Auteur/Prénom
E E T Text()
Auteur Nom
<Cours>
<!--ceci est exemple XPath--> E T Text()
<Titre soutitre=’XPath’>Cours XML</Titre>
Prénom
<Auteur>
<Nom>Benslimane</Nom>
E T Text()
<Prénom>Sidi Med</Prénom>
</Auteur> Description
<Description> E T Text()
Ce cours aborde les <b>concepts</b>
b
de base dans XPath.
<!-- c'est le meilleur cours !!! --> T Text()
</Description>
</Cours>
-- Comment()

/Cours/Description/comment()
/Cours/Description/node()
Les Prédicats
[axe::]filtre[predicat1] [predicat2]…[predicatN]
Un prédicat est destiné à filtrer un ensemble de noeuds.
• Ces tests peuvent impliquer des fonctions ou de
nouveaux chemins Xpath.
• Un prédicat est composé d’une expression booléenne
appelée expression du prédicat qui peut être:
– Condition d’existence
– Condition de position
– Condition logique
Les Prédicats: Condition d’existence
Permet de sélectionner un noeud en fonction de ses fils, père,
attributs, etc.
•Exemple : //AA[DD]

<ROOT> <ROOT>
<AA> <AA>
<BB> <BB>
<CC/> <CC/>
</BB> </BB>
<DD/> <DD/>
</AA> </AA>
<AA> <AA>
<BB/> <BB/>
</AA> </AA>
</ROOT> </ROOT>

Sélectionne tous les AA possédant au moins un fils DD


Les Prédicats: Condition de position
La fonction position() renvoie la position du noeud en lecture dans
son contexte parent.
La numérotation des positions en XPath commence à 1.

<ROOT> <ROOT>
<AA> <AA>
<BB> <BB>
<CC/> <CC/>
</BB> </BB>
<DD/> <DD/>
</AA> /ROOT/AA[position()=2] ou /ROOT/AA[2] </AA>
<AA> <AA>
Sélectionne le deuxième fils AA de ROOT
<BB/> <BB/>
</AA> </AA>
</ROOT> </ROOT>
Les Prédicats: Condition de position
<stock>
<produit>
<nom> Livre </nom>
<prix monnaie="Dinard"> 50 </prix>
<comment> Un commentaire </comment>
</produit>
<produit>
<nom> DVD </nom>
<prix monnaie="Euros"> 2 </prix>
</produit>
</stock>

/stock/produit[1]
<stock>
<produit>
<nom> Livre </nom>
<prix monnaie="Dinard"> 50 </prix>
<comment> Un commentaire </comment>
</produit>
<produit>
<nom> DVD </nom>
<prix monnaie="Euros"> 2 </prix>
</produit> sélectionne le premier
</stock> élément produit de stock.
Les Prédicats: Condition de position

<ROOT> <ROOT>

<AA> <AA>

<BB> <BB>

<CC/> //*[2] <CC/>

</BB> </BB>

<DD/> <DD/>

</AA> </AA>

<AA> <AA>

<BB/> <BB/>

</AA> </AA>

</ROOT> </ROOT>

Ne renvoie pas le deuxième noeud de la sélection mais tous les


nœuds qui sont des deuxièmes fils.
Les Prédicats: Condition logique
expr-xpath1 relation expr-xpath2
• Vraie ssi il existe n1 (dans le résultat de expr-xpath1) et n2 (dans le résultat de
expr-xpath2) qui respectent la relation.

• Les relations possibles sont =, != , < , <= , > , >=

produit[prix = 100]
produit[prix != 100]
produit[prix < /stock/produit/prix]

(1) les produits qui ont un prix égale à 100 ;


(2) les produits qui ont un prix différent de 100 ;
(3) tous les produits sauf le (les) plus cher(s).
Les Prédicats: Condition logique
condition1 and condition2
• Vraie ssi les deux conditions le sont également.

produit[prix > 10 and prix<100 ]


tous les produits ayant un prix supérieur à 10 et inferieur à 100

condition1 or condition2
• Vraie ssi au moins une des deux conditions est vraie.

produit[prix =10 or prix=50 ]


tous les produits ayant un prix égale à 10 ou à 50

not(condition)
vraie ssi la condition est fausse.

produit[not(prix != 100)]
tous les produits ayant un prix égal à 100
Les opérations & fonctions
Opérations sur les nombres

+, -, mod, div,

produit[(prix mod 10) = 2]


Les opérations & fonctions
Fonctions sur les nombres
number(object): traduire l’objet sous la forme d’un nombre.
renvoie NaN si l’objet ne représente pas un nombre.
sum(noeuds): renvoie la somme des noeuds après les avoir
transformés en nombre.
round(nombre): arrondi par le plus proche.
count(noeuds): renvoie le nombre de nœuds de l'ensemble
passé en argument.

Exemples
sum(//prix)
calcule la somme des contenus de tous les éléments prix du document XML.
//*[count(livre)=2]
Les éléments ayant 2 enfants livre
Count(//*[count(*)=2])
Le nombre d’éléments ayant deux enfants
Les opérations & fonctions
Fonctions sur les nombres
count(noeuds): renvoie le nombre de nœuds de l'ensemble
passé en argument..

count(/ROOT/AA)
renvoie 3

count(/ROOT/*)
renvoie 5.
Les opérations & fonctions
Fonctions sur les booléens

true(): toujours vraie.


false(): toujours fausse.
boolean(objet): Convertit l'argument passé en booléen.
– Un ensemble de noeuds est vrai (true) ssi n'est pas vide.
– Une chaîne de caractères est vrai (true) ssi sa longueur n'est pas nulle.

<a >
<b>bla bla</b> boolean(/a/b)  true()
<d>bla bla</d> boolean(/a/e)  false()
</a>
Les opérations & fonctions
Fonctions sur les nœuds

last(): vraie ssi le noeud est le dernier du contexte


courant.
position(): renvoie la position dans le contexte du noeud
courant.
id(nom): renvoie les noeuds ayant un ID égal à l'un des
mots de la chaîne passée en argument
name(noeuds): renvoi une chaîne représentant le nom du
premier noeud de l'ensemble passé en argument.
Les opérations & fonctions
Fonctions sur les chaînes
substring(chaine, number, number?) renvoie la sous-chaîne du premier
argument commençant à la position spécifiée par le second argument et de
longueur spécifiée par le troisième argument.
substring("sidi bel abbes",1,4)
retourne "sidi"
substring("sidi bel abbes",10)
retourne "abbes"

concat(chaîn1,...,chaîneN) : concaténation de chaînes.


concat('Hello', 'new', 'world') retourne 'Hellonewworld‘

String-length(chaîne): renvoie la longueur d’une chaîne.


string-length("bonjour") retourne 7
//*[string-length(name())=3]
retourne tous les éléments dont le nom a trois caractères.

normalize-space(chaîne): renvoie une version normalisée (suppression des


blancs au début et à la fin et remplacement de toute suite de blancs par un seul).
Les opérations & fonctions
Fonctions sur les chaînes

starts-with(ch1, ch2), est évalué à vrai si ch1 commence par ch2

ends-with(ch1, ch2) : est évalué à vrai si ch1 termine par ch2

substring-before(ch1, ch2): retourne la partie de ch1 située avant ch2


substring-before("012345", "2")
renvoie la chaîne "01"

substring-after(ch1,ch2): retourne la partie de ch1 située après ch2


substring-after("012345", "2")
renvoie la chaîne "345"

contains(ch1,ch2): vraie ssi ch1 contient ch2.


Sélection Multiple

L’opérateur | permet de sélectionner plus


d’un nœud.

Syntaxe:
cheminXpath1|cheminXPath2|...

Exemple:
/enseignant/nom|/etudiant/nom
Syntaxe abrégée
• Les constructions les plus fréquentes des expressions XPath peuvent être
abrégées de façon à avoir des expressions plus concises. Les abréviations
possibles sont les suivantes.

Originale Abrégée
child::
attribute:: @
/descendant-or-self::node()/ //
self::node() .
parent::node() ..
[position()=n] [n]
<?xml version="1.0" encoding="UTF-8"?>
<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> Exemples de requêtes absolues
/
sélectionne un nœud "fictif", dit root element, qui englobe tout le document, y compris <?xml version="1.0"?>
/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"
<?xml version="1.0" encoding="UTF-8"?>
<racine>
<encyclopedie nom="Wikipedia" site="http://fr.wikipedia.org/">
<article nom="XPath">
<auteurs>
<auteur>
<nom>Dupont</nom>
</auteur>
<auteur>
<nom>Patrice</nom>
</auteur>
</auteurs>
</article>
</encyclopedie>
</racine>
Exemples de requêtes relatives
dans le contexte de l’élément encyclopedie

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 (Patrice) du premier article
article[count(auteurs/auteur)>2]
sélectionne les articles qui ont au moins 3 auteurs
Motif Signification
/ la racine du document
* tous les éléments
section tous les éléments section
chapter|section tous les éléments chapter et section
chapter/section tous les éléments section enfants d'un élément chapter
chapter//section tous les éléments section descendants d'un élément chapter
//section tous les éléments section du document
./section tous les éléments section fils du nœud courant
*/section Tous les éléments section petit fils du nœud courant
section[1] tous les éléments section qui sont le premier enfant de leur parent
section[@lang] tous les éléments section ayant un attribut lang
section[@lang='fr'] tous les éléments section dont l'attribut lang a la valeur fr
section/@lang tous les attributs lang des éléments section
@* tous les attributs
./@* Tous les attributs de l’élément courant
*[last()] Le dernier fils du nœud courant
node() tous les nœuds
text() tous les nœuds textuels
comment() tous les commentaires

Vous aimerez peut-être aussi