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