XPathXML Path Language
Sébastien [email protected]‐‑pau.fr
Christian SallaberryChristian.Sallaberry@univ-‐‑pau.fr
Bibliographie
o http://www.w3.org/XML/o http://www.w3schools.com/xpath/o http://bibliotheques.univ-pau.fr/live/livres-
electroniques/edition-ENIo http://www.gchagnon.fr/cours/xml/index.htmlo http://www.w3.org/TR/xpath-datamodel/o http://www.w3.org/TR/xpath-full-text-10-use-cases/
2
XPath : présentation
3
http://www.w3schools.com/xpath/
XPath : présentation
• XPath est un langage déclaratif permettant de spécifier des chemins dans une arborescence XML
• XPath est utilisé dans de nombreux dialectes XML :o XSLT pour la transformation d’ensembles d’élémentso XQuery pour l’interrogation d’ensembles d’élémentso XLink et XPointer qui ne seront pas traités ici
4
XPath : données, environnement
• Le modèle définit sept types de nœuds :o Nœud documento Nœud élémento Nœud espace de nomo Nœud attributo Nœud texteo Nœud instruction de traitemento Nœud commentaire
5
XPath : données, environnement
• Exemple de nœuds du modèle :o Nœud documento Nœud élémento Nœud espace de nomo Nœud texteo Nœud attributo Nœud instruction de traitemento Nœud commentaire
6
racine
<?xml
version="ʺ1.0"ʺ ?>collection
recette
Categorie =
« plat »titre
« Poivrée de … »
image
Src = « http://… »
commentaire
Auteur =
« Laborie »« Très bon »
ingrédient
Nom = « céleri »
Qte = « 500 »
Unite = « g »
…
…
XPath : expressions
• Une expression Xpath peut être :o Une expression primitive ;
• dont le résultat est un objet unique du modèle de donnée du document XML
o Une expression de chemin ;• dont le résultat est une séquence de nœuds
o Une expression de séquence ;• comme une expression de répétition, conditionnelle, de quantification ou booléenne
o Un mélange de tous ces types d’expressions.
7
XPath : expressions
• Une expression Xpath peut être une expression primitive• Expression d’une valeur :xs:float('5.24'); xs:date('2010-01-01'); xs:integer('5')• Référencement d’une variable :for $i in 1 to 5 return $i * $i• Expression du contexte courant :/collection/recette/titre[contains(.,'Salade')]• Expression entre parenthèses :2 * (3 + 2) ; 2 * 3 + 2 • Fonctions :
- Nombres : 2*3- Chaînes : contains('bonjour','bon')- Dates : xs:date('2012-01-03') - xs:date('2012-01-01')
Comment convertir une telle durée en entier ? - Booléens : true and false- Nœuds : /collection/count(recette)
8
http://www.w3.org/TR/2007/REC-xpath-functions-20070123/
XPath : expressions
• Une expression Xpath peut être une expression de chemin formée de trois éléments :o axe : direction dans laquelle s'effectue l'évaluation (noeud père, noeuds fils, ...) ;o filtre : type de noeuds à retenir (noeuds quelconques, éléments précis,...) ;o Prédicat : conditions (optionnelles) à vérifier par les noeuds retenus
• Ces trois éléments joints forment une étape XPath• L’enchainement de plusieurs étape forme un chemin
XPath :o Les étapes d’un chemin sont séparées par le caractère « / »o Les prédicats sont exprimés entre « [] »
o Des disjonctions (choix) d’étapes sont spécifiées à l’aide du caractère « | »
9
XPath : expressions
• Un chemin XPath est de la forme :o axe1::filtre1[predicat1]/axe2::filtre2[predicat2]o axe1::filtre1[predicat1]/axe2::filtre2[predicat2]|axe3::filtre3[predicat3]
• Un chemin commençant par « / » est dit absolu, sinon il est relatif (au contexte (nœud courant))
• En somme, une expression de chemin o spécifie une traversée de l'arbre du document (un chemin) :
• depuis un nœud de départ• … vers un ensemble de nœuds cibles
o a pour résultat• un ensemble de nœuds• ou une valeur numérique, booléenne ou alphanumérique
10
XPath : chemins
• Axes
11self = nœud courant = contexte
XPath : chemins
12
• ancestor
self = nœud courant = contexte
XPath : chemins
13
• ancestor-or-self
self = nœud courant = contexte
XPath : chemins
14
• attribute
self = nœud courant = contexte
XPath : chemins
15
• child
self = nœud courant = contexte
XPath : chemins
16
• descendant
self = nœud courant = contexte
XPath : chemins
17
• descendant-or-self
self = nœud courant = contexte
XPath : chemins
18
• following
self = nœud courant = contexte
XPath : chemins
19
• following-sibling
self = nœud courant = contexte
XPath : chemins
20
• namespace
self = nœud courant = contexte
XPath : chemins
21
• parent
self = nœud courant = contexte
XPath : chemins
22
• preceding
self = nœud courant = contexte
XPath : chemins
23
• preceding-sibling
self = nœud courant = contexte
XPath : chemins
24
• self
self = nœud courant = contexte
XPath : chemins
• Axes : en résuméo self : le nœud courant lui-mêmeo child, parent : les nœuds enfants, le nœud pèreo descendant, descendant-or-self : les descendants, les
descendants ou lui-mêmeo ancestor, ancestor-or-self : les ancêtres, les ancêtres ou lui-
mêmeo preceding, following : les nœuds précédents ou suivantso preceding-sibling, following-sibling : les nœuds frères précédents
ou les nœuds frères suivantso attribute : les attributs du nœud couranto namespace : les noeuds espace de noms du noeud contexte
25self = nœud courant = contexte
XPath : chemins
• Axes : en exemple? /child::node()? /descendant::node()? /descendant::text()
26self = nœud courant = contexte
XPath : chemins
• Filtres : sélectionnent, parmi les nœuds de l’axe, ceux qui correspondent à un type donné
o * : nœuds de l’axe ayant le même type que le type principal de l’axe
? child::*? attribute::*
o nom : nœuds de l’axe ayant le même type que le type principal de l’axe et de nom nom
? ancestor::recette? attribute::categorie
o node() : tout nœud de l’axeo element() : tout nœud de l’axe de type element
? element(nom)? element(nom, type)? element(*,type)
27
XPath : chemins
• Filtres : sélectionnent, parmi les nœuds de l’axe, ceux qui correspondent à un type donné
o attribute() : tout nœud de l’axe de type attribut
? attribute(nom)? attribute(nom, type)? attribute(*,type)
o text() : tout nœud de l’axe de type texteo comment() : tout nœud de l’axe de type commentaireo processing-instruction() : tout nœud de l’axe représentant une
instruction de traitemento processing-instruction(nom) : tout nœud de l’axe représentant
une instruction de traitement de nom nom
28
XPath : chemins
• Axes et filtre : raccourcis
child peut être omisdescendant-or-self::node() peut être remplacé par //element() peut être remplacé par *attribute() peut être remplacé par @self::node() peut être remplacé par .parent::node() peut être remplacé par ..
29
XPath : exemples de chemin
30
XPath : exemples de chemin
31
• Axes & filtres
32
child::titre : les éléments titre enfants du nœud contextuelchild::* : tous les éléments enfants du nœud contextuelchild::text() : tous les nœuds textuels enfants du nœud contextuelchild::element() : tous les nœuds element enfants du nœud contextuelchild::node() : tous les enfants du nœud contextuel, quel que soit leur type (élément ou autre)attribute::categorie : l'attribut categorie du nœud contextuelattribute::* : tous les attributs du nœud contextueldescendant::ingredient : tous les descendants ingredient du nœud contextuelancestor::recette : tous les ancêtres recette du nœud contextuelancestor-or-self::recette : tous les ancêtres recette du nœud contextuel et le nœud contextuel lui-même si c'est un nœud recette
XPath : exemples de chemin
• Axes & filtres
33
descendant-or-self::ingredient : tous les descendants ingredient du nœud contextuel et le nœud contextuel lui-même si c'est un nœud ingredientself::ingredient : le nœud contextuel si c'est un élément ingredient et rien dans le cas contrairechild::collection/descendant::titre : les descendants titre des éléments collection enfants du nœud contextuelchild::*/child::preparation : tous les petits enfants preparation du nœud contextuel
XPath : exemples de chemin
• Axes & filtres? Les recettes? Les titres des recettes? Les noms des ingrédients des recettes
34
XPath : exemples de chemin
XPath : chemins
• Un prédicat est une expression logique entre crochets [] retournant vrai ou faux
• Il existe quatre formes de prédicats :o axe::filtre[numéro]o axe::filtre[expression XPATH]o axe::filtre[expression logique]o prédicats composés
35
XPath : chemins
o axe::filtre[numéro]
Sélectionne les nœuds en fonction de leur position :/collection/recette[position()=2]/collection/recette[position()=2]/element()/collection/recette[position()=2]/*/collection/recette[position()=last()]/collection/recette[last()]/collection/recette[2]
36
XPath : chemins
o axe::filtre[expression XPATH]
Sélectionne les nœuds pour lesquels l’expression XPATH renvoie un ensemble de nœuds non vide :/collection/recette/titre[text()]/collection/recette[image]/titre/collection/recette[@categorie]/titreTitres des recettes comportant une étape de préparation dont la durée est stipulée ?
37
XPath : chemins
o axe::filtre[expression logique]
Sélectionne les nœuds pour lesquels l’expression logique renvoie la valeur VRAI
L’expression logique peut comporter :• des opérateurs mathématiques +, -, *, div, mod• des opérateurs de comparaison binaires =, !=, <, <=, >,
>=, unaire NOT• des connecteurs logiques ET, OU• des fonctions relatives à des objets de type nœud,
chaine de caractères, booléen, numérique, …
38
XPath : chemins
o axe::filtre[expression logique]
Fonctions XPath applicables aux nœuds : • number count(ns)• number position()
/collection/recette/titre[position()=1]/collection/recette[position()=1] /titre
• number last()/collection/recette/titre[last()]/collection/recette[last()]/titre
• node-set id(o)• …
39
n = number; s = string; o = object;ns = node-set; ? = 0|1; * = 0, .., N
XPath : chemins
o axe::filtre[expression logique]
Fonctions XPath applicables aux chaines de caractères : • string string(o?)• string concat(s,s,s*)• string substring(s,n,n?)• string substring-before(s,s)• string substring-after(s,s)• boolean contains(s,s)• boolean starts-with(s,s)• number string-length(s?)• …
40
n = number; s = string; o = object;ns = node-set; ? = 0|1; * = 0, .., N
XPath : chemins
o axe::filtre[expression logique]
Fonctions XPath booléennes : • boolean boolean(o)
boolean(5)boolean("ttt")boolean(/collection/recette[position()=1] /titre)
• boolean not(o)• boolean true()• boolean false()• …
41
n = number; s = string; o = object;ns = node-set; ? = 0|1; * = 0, .., N
XPath : chemins
o axe::filtre[expression logique]
Fonctions XPath applicables aux numériques : • number number(o?)• number sum(ns)• number floor(n)• number ceiling(n)• number round(n)• …
42
n = number; s = string; o = object;ns = node-set; ? = 0|1; * = 0, .., N
• Axes, filtres & prédicats
43
child::recette[position()=1] : le premier enfant recette du nœud contextuelchild::recette[position()=last()] : le dernier enfant recette du nœud contextuelchild::recette[position()=last()-1] : l'avant dernier enfant recette du nœud contextuelchild::recette[position()>1] : tous les enfants recette du nœud contextuel autres que le premierfollowing-sibling::recette[position()=1] : la prochaine recette cible du nœud contextuelpreceding-sibling::recette[position()=1] : la précédent recette cible du nœud contextueldescendant::recette[position()=42] : le 42ième élément recette du documentchild::collection/child::recette[position()=2]/child:: ingredient[position()=3] : le 3ième ingredient de la 2ième recette de l'élément collectionchild::recette[attribute::categorie=‘entree’] : tous les enfants recette du nœud contextuel qui ont un attribut categorie dont la valeur est entree
XPath : exemples de chemin
• Axes, filtres & prédicats
44
child::recette[attribute::categorie=‘entree'][position()=2] : le 2ième enfant recette du nœud contextuel qui a un attribut categorie dont la valeur est entreechild::recette[position()=2][attribute::categorie =‘entree'] : le 2ième enfant recette du nœud contextuel si celui-là a un attribut categorie de valeur entreechild::recette[child::titre='Salade de chèvres chauds'] : l'enfant recette du nœud contextuel qui a un ou plusieurs enfants titre avec un contenu textuel égal à Salade de chèvres chauds/collection/child::recette/child::titre[contains(.,'Salade')] : ?/collection/child::recette[child::titre] : ?/collection/recette/child::*[self::titre or self::image] : ?/collection/recette/child::*[self::ingredient or self::preparation][position()=last()] : ?
XPath : exemples de chemin
• Axes, filtres & prédicatso Les titres de toutes les recettes ?o Les titres des recettes qui comptent plus de trois ingrédients ?o Les recettes qui citent « autruche » dans le titre ?o Toutes les recettes dans le détail ?? /collection/recette/titre/text()[starts-with(., 'Po')]? /collection/recette/titre[starts-with(., 'Po')]? /collection/recette/*[@qte][position()<7]? /collection/recette/descendant::titre? /collection/recette/attribute::categorie? /collection/recette/@categorie? /collection/recette/*[@qte]? /collection/recette/*[self::titre or self::ingredient]? /collection/recette/*[not(self::titre or self::ingredient)]
45
XPath : exemples de chemin
• Les expressions suivantes construisent des séquences d’objets nœuds ou valeurs atomiqueso Expression d’un intervalle
• 3 to 5; 5 to 5; 7 to 5o Expression de répétition
• for $i in (2, 4), $j in (1 to 3) return ($i + $j)• for $clt in //client return $clt/nom
o Filtrage de séquence• ("a","b","c","d")[position() mod 2 = 0]• for $clt in //client[civilite = "Mr"] return $clt/nom• for $clt in //client[$clt/civilite = "Mr"] return $clt/nom< !-- civilite ou ./civilite au lieu de $clt/civilite car la variable de parcours $x ne peut
être utilisée que dans le return -- >o Quantificateur existentiel
• some $i in (1,2,3,4) satisfies $i > 3• //commande[some $p in ./detail/produit satisfies $p/@ref = "FEUTR-
BIC"]/@id
46
XPath : séquences
Exercices !
Recherche d’information
avec XPath
47
Exercice 1 : éditeur oXygen
• Editez un premier document XML et l’interroger
48
Exercice 1 : éditeur oXygen
• Editez un premier document XML et l’interroger
49
Exercice 1 : éditeur oXygen
• Editez un premier document XML et l’interroger
50
Exercice 2 : Oxygen & XPath
o Interroger le fichier gestion_commerciale.xml :• Noms et prénoms des clients
• Clients qui ont des commandes
• Clients et nombre de commandes
• Clients qui ont plus de 2 commandes
• Clients qui n’ont pas de commande
• Désignation et prix des produits à plus de 10 euros
• Produits en rupture de stock (quantité en stock >2)
• Produits commandés
• Code des commandes comprenant plus de deux lignes de commande
• Nombre total de bâtons de colle commandés
• Nombre de bâtons de colle en stock
• Nombre de commandes
51