Académique Documents
Professionnel Documents
Culture Documents
XPath
•Axes XPath
•Formes abrégées et verbeuses
•Predicats, collections, prédicats composés
•Fonctions XPath :
•fonctions d'ensembles de nœuds,
•fonctions de chaînes,
•fonctions booléennes,
•fonctions numériques
•Divers
2
par Philippe Poulard Qu'est-ce ?
Standard du w3c
http://www.w3c.org/TR/xpath
XPath est un langage non XML utilisé pour adresser des items dans un document XML
(modèle logique)
•Sa syntaxe élémentaire ressemble à l'expression d'un chemin dans un file system
•Sa syntaxe formelle plus du tout
regedit.exe
WINNT
text()
Setup1.exe / Cours Titre
text()
mmsystem.dll Prénom
text()
/WINNT/system
Description
text()
Expression XPath qui /Cours/Auteur/Prénom b
retourne 1 nœud text()
4
par Philippe Poulard Adressage relatif dans XPath
..
autoexec.bat
/
config.sys
text()
/ Cours Titre
admin.pub
temp text()
Auteur Nom
svf1.tmp
text()
.
XPath
Prénom
regedit.exe
WINNT
text()
Description
Setup1.exe ../regedit.exe
text()
.. b
keyboard.drv
system text()
../Description
. mmsystem.dll
Le répertoire courant est déterminé par Le nœud contextuel est déterminé par
l'interpréteur de commandes l'application utilisatrice de XPath
5
par Philippe Poulard Comparaison XPath / file system
Une expression peut être évaluée à Une URL peut être évaluée à partir
partir d'un nœud spécifique, appelé d'un d'un répertoire spécifique,
"le nœud contextuel" de la requête appelé "le répertoire courant"
ensemble d'objets qui peut être un Une URL identifie un fichier unique
ou plusieurs nœuds
A chaque niveau les noms des A chaque niveau les noms des
éléments peuvent ne pas être uniques fichiers sont uniques
6
par Philippe Poulard Sélection d'un ensemble de nœuds
text()
/ animaux chiens chien
text()
<?xml version="1.0" encoding="ISO-8859-1" ?> couleur
<animaux>
<chiens>
text()
<chien>Lassie
<couleur>noir</couleur> chien
</chien>
<chien>Médor text()
<couleur>marron</couleur> couleur
</chien>
XPath
</chiens> text()
<chats> chats chat
<chat>Félix
<couleur>crème</couleur> text()
</chat>
<chat>Tom couleur
<couleur>crème</couleur>
</chat> text()
<chat>Rominet chat
<couleur>gris</couleur>
</chat> text()
</chats> couleur
</animaux>
text()
chat
text()
/animaux/chats/chat
couleur
7 /animaux/chats/chat/couleur
par Philippe Poulard Sélection de nœud d'attribut
@ è attribut
"at"
race
text()
/animaux/chiens/chien/@race
/ animaux chiens chien
text()
couleur
race
text()
<?xml version="1.0" encoding="ISO-8859-1" ?> chien
<animaux>
<chiens> text()
couleur
<chien race="Labrador">Mabrouk
XPath
<couleur>noir</couleur> race
</chien> text()
<chien race="Labrador">Médor
chats chat
<couleur>marron</couleur>
</chien>
text()
</chiens> couleur
<chats>
race
<chat race="Siamois">Félix
<couleur>crème</couleur> text()
</chat> chat
<chat race="Birman">Tom
<couleur>crème</couleur> text()
couleur
</chat>
<chat race="Abyssin">Rominet race
<couleur>gris</couleur>
</chat> text()
</chats> chat
</animaux>
text()
couleur
8
par Philippe Poulard Modèle de données XPath
Types de nœuds XPath Document XML è arborescence de noeuds
•nœuds d'élément
foo-élément
•nœuds de texte
text()
•nœuds d'attribut
XPath
@bar-attribut
•nœuds de commentaire
comment() Sont exclus du modèle :
•nœuds d'instruction de traitement •les sections CDATA
processing-instruction()
•les appels d'entités
•la clause DTD
•nœuds d'espace de nom •la déclaration XML
namespace::foo-ns
Normalisation
]>
<foo>L'élément "foo" <![CDATA[(de <foo> à </foo>)]]>
ne contient qu'un seul nœud texte &fusion;
</foo>
text()
/ foo L'élément "foo"
text()
Les appels d'entité, les appels
de caractère et les sections
(de <foo> à </foo>)
text()
CDATA sont indiscernables des
XPath
text()
ud texte
text()
normalization
text()
/ foo L'élément "foo" (de <foo> à </foo>) ne contient qu'un seul
nœud texte (tout est fusionné)
10
par Philippe Poulard Modèle de données XPath
Les valeurs par défaut des attributs fournis par la DTD sont fixées
<?xml encoding="ISO-8859-1"?>
<!DOCTYPE foo [ bar
<!ATTLIST foo bar CDATA #FIXED "BAR"> BAR
/ foo
]>
<foo/>
Les attributs xmlns sont rapportés comme des nœuds d'espace de noms, et sont
attachés à tous les nœuds d'élément et d'attributs dans la portée de la déclaration
XPath
<?xml version="1.0"?>
<svg:svg width="18cm" height="6cm"
xmlns:svg="http://www.w3.org/2000/svg">
<svg:rect x="1" y="1" width="198"
height="118"/>
</svg:svg>
height y
width x
svg:svg height
/ width
svg:rect
svg svg
"héritage"
11
par Philippe Poulard Modèle de données XPath
Caractéristiques du noeud
Construction XML
Type Nom Valeur
- Document - -
<élément> Element Nom de l'élément -
12
par Philippe Poulard Chemin de localisation
..
../Description
/animaux/chats/chat/couleur
Chemin de
XPath
localisation
Chaque étape est évaluée dans le contexte de
l'étape précédente
/animaux/chats/chat/couleur
Le contexte d'évaluation d'une étape est l'ensemble
des nœuds obtenu par l'évaluation de l'étape précédente Etape de
localisation
14 Les nœuds d'espace de nommage ne sont pas adressables par des tests de nœud
par Philippe Poulard Jokers de tests de nœud
Les jokers permettent de sélectionner différents items et types de nœuds différents
c'est l'URI associée qui est prise en compte, et non pas le préfixe lui-même
XPath
dépend du processeur et de
l'application utilisatrice
text()
/ Cours Titre
text()
Auteur Nom
<?xml version="1.0" encoding="ISO-8859-1"?>
<Cours> text()
<Titre>Cours XML</Titre>
<Auteur> Prénom
<Nom>Poulard</Nom>
<Prénom>Philippe</Prénom> text()
XPath
</Auteur> Description
<Description>
Ce cours aborde les <b>concepts</b> de text()
base mis en œuvre dans XML.
b
<!-- c'est le meilleur cours !!! -->
<?diaporama file="xml.ppt"?> text()
</Description>
</Cours>
comment()
/Cours/Description/comment() processing-instruction()
/Cours/Description/node()
16
par Philippe Poulard Axes XPath
XPath permet de spécifier la "direction" dans laquelle un test de nœud doit être réalisé.
Il y a 13 axes différents.
XPath propose une . self::*
syntaxe abrégée pour les .. = parent::*
Syntaxe : axe::test-de-noeud
axes les plus utilisés.
* child::*
text()
/ Cours Titre
../Description
text()
= parent::*/child::Description
Auteur Nom
text()
self Prénom
child
text()
parent
attribute Description
namespace
text()
descendent
descendent-or-self
Axe self .
b
ancestor
ancestor-or-self text()
following
following-sibling
17
preceding Nœud contextuel
preceding-sibling
par Philippe Poulard Axes typés XPath
2 axes particuliers permettent de sélectionner des types de nœud :
attribute et namespace permettent d'accéder aux nœuds correspondants
namespace::foo-ns
L'axe des attributs
attribute::bar-attribut = @bar-attribut bénéficie d'une
forme abrégée
<?xml version="1.0"?>
<svg:svg width="18cm" height="6cm"
xmlns:svg="http://www.w3.org/2000/svg">
<svg:rect x="1" y="1" width="198"
height="118"/>
</svg:svg> /svg:svg/svg:rect/@y
self
child /child::svg:svg/attribute::height
parent
attribute
namespace /child::svg:svg/namespace::svg height y
descendent x
width
descendent-or-self
ancestor svg:svg height
ancestor-or-self / width
following svg:rect
following-sibling svg
svg
preceding
18 preceding-sibling
par Philippe Poulard Axes non typés XPath
descendent::node() = .//node()
forme abrégée
ancestor-or-self::node()
text()
/ Cours Titre
ancestor::node()
text()
Auteur Nom
text()
text() Prénom
XPath
text() b
Prénom text()
self
child text()
parent Description
attribute
namespace text()
descendent
b
descendent-or-self descendent-or-self::node()
ancestor text()
ancestor-or-self
following
following-sibling
preceding Nœud contextuel
19 preceding-sibling
par Philippe Poulard Axes non typés XPath
Même parent que le nœud preceding-sibling::node()
de référence
Auteur Nom
text()
text() Prénom
XPath
text() b
Prénom text()
self
child text()
following-sibling::node()
parent Description
attribute Même parent que le
namespace text() nœud de référence
descendent
b
descendent-or-self
ancestor text()
following::node() Nœuds commençant
ancestor-or-self après la fin du nœud de référence
following
following-sibling
preceding Nœud contextuel
20 preceding-sibling
par Philippe Poulard Piège XPath
Joker universel : node()
Sélectionne tous les nœuds, quel que soit leur type
Sélectionne tous les nœuds de
Exemple : /animaux/chats/chat/node()
l'élément chat, s'il y en a plusieurs
21
par Philippe Poulard Formes verbeuses et abrégées des expressions
Limitation des axes XPath : il n'existe pas d'axe de parcours "naturel" d'un arbre
22
par Philippe Poulard Prédicats XPath
Un prédicat permet de spécifier un filtre Syntaxe : axe::test-de-noeud[prédicat]
dans une étape de localisation race
Un prédicat est une expression text()
booléenne qui sera testée pour / animaux chiens chien
chaque nœud de l'ensemble text()
des nœuds de l'étape de couleur
localisation race
//chat[couleur="crème"] text()
chien
<?xml version="1.0" encoding="ISO-8859-1" ?>
<animaux> text()
XPath
couleur
<chiens>
<chien race="Labrador">Mabrouk race
<couleur>noir</couleur>
text()
</chien>
<chien race="Labrador">Médor chats chat
<couleur>marron</couleur>
</chien> text()
couleur
</chiens>
<chats> race
<chat race="Siamois">Félix text()
<couleur>crème</couleur> chat
</chat>
<chat race="Birman">Tom
<couleur>crème</couleur> non couleur text()
Les expressions booléennes peuvent être exprimées avec un jeu de fonctions XPath,
comme string(), position(), last()…
24
par Philippe Poulard Collections
Les crochets [ et ] ont une race
priorité plus grande que le slash /, text()
mais on peut aussi utiliser des / animaux chiens chien
parenthèses ( et ).
text()
couleur
<?xml version="1.0" encoding="ISO-8859-1" ?>
<animaux> race
<chiens>
<chien race="Labrador">Mabrouk text()
<couleur>noir</couleur> chien
</chien>
<chien race="Labrador">Médor text()
couleur
<couleur>marron</couleur>
</chien> race
XPath
</chiens> text()
<chats>
chats chat
<chat race="Siamois">Félix
<couleur>crème</couleur>
text()
</chat> couleur
<chat race="Birman">Tom
race
<couleur>crème</couleur>
</chat> text()
<chat race="Abyssin">Rominet chat
<couleur>gris</couleur>
</chat> text()
couleur
</chats>
</animaux> race
text()
/animaux/*/*[position()=last()]
chat
text()
(/animaux/*/*)[position()=last()] couleur
25
par Philippe Poulard Prédicats composés
Syntaxe : axe::test-de-noeud[prédicat][prédicat][prédicat]
race
Les prédicats sont évalués text()
successivement sur le résultat / animaux chiens chien
du précédent. text()
couleur
race
<?xml version="1.0" encoding="ISO-8859-1" ?> text()
<animaux>
chien
<chiens>
…/… text()
<chiens> couleur
XPath
<chats> race
<chat race="Siamois">Félix
<couleur>crème</couleur> text()
</chat> chats chat
<chat race="Birman">Tom
<couleur>crème</couleur> text()
couleur
</chat>
<chat race="Abyssin">Rominet race
<couleur>gris</couleur>
text()
</chat>
</chats> chat
</animaux>
text()
couleur
//chat[couleur="crème"][position()=last()] race
text()
chat
vide
//chat[position()=last()][couleur="crème"] text()
couleur
26
par Philippe Poulard Fonctions d'ensemble de nœuds XPath
position() Retourne le numéro d'index du nœud de référence dans le nœud parent
/animaux/*/*[position()=1] Forme abrégée : /animaux/*/*[1]
passé en argument
//*[name(.)!="svg:rect"]
id(string) Retourne les nœuds ayant un ID égal à l'un des mots de la chaîne passée
en argument
27 id("ref123 ref456 ref789")
par Philippe Poulard Fonctions de chaînes XPath
concat(string* ) Retourne la concaténation des chaînes passées en argument
translate(string, string, string) Retourne la chaîne passée en 1er argument dont les
caractères de la 2e chaîne passée en argument ont été
remplacés par ceux de même index de la 3e chaîne passée en
28 argument
par Philippe Poulard Conversion des nœuds en chaînes
Tous les nœuds peuvent être convertis en chaîne de caractère
string(object) Retourne la chaîne correspondante, en fonction du type :
…donc :
string(/animaux/*) retourne Mabrouk noir Médor marron
string(/animaux) retourne Mabrouk noir Médor marron Félix crème Tom crème Rominet gris
boolean(object)
Numérique
≠0 Vrai
true()
false()
Booléen Vrai 1
Faux 0
Ensemble de nœuds Converti en chaîne, puis comme ci-dessus
Opérations numériques
+
- Pour -, div et mod, il faut
* laisser un espace de part et
div d'autres de l'opérateur
mod
31
par Philippe Poulard Ordre de parcourt d'un axe XPath
Tous les axes "remontants" ou "arrières" commencent au plus près du nœud contextuel.
XPath
Ainsi, les opérations numériques sur les nœuds sont sensibles au sens de parcours.
Sur un même ensemble de nœud, le premier nœud dans un sens de lecture "arrière" ou
"remontant" est le dernier nœud dans un sens de lecture "avant" ou "descendant"
32
par Philippe Poulard Comparaison d'ensembles de nœuds
<item>3</item>
<item>4</item>
<item>6</item>
<item>7</item>
</b>
</data>
•2 ensembles de nœuds (nodeset) sont équivalents si l'un de leur nœud est égal
•2 ensembles de nœuds sont différents si l'un de leur nœud est différent
Les tests d'égalité et d'inégalité sur les nœuds doivent être compris comme des
tests sur les ensembles
33
par Philippe Poulard Curiosités
x est-il numérique ?
number(x)!=number(x)
est faux, alors x est numérique
34
par Philippe Poulard Synthèse
expression XPath
Boolean
String
Number
NodeSet chemin de localisation étape/étape/étape
étape de localisation
axe::test-de-noeud[prédicat][prédicat][prédicat]
XPath