23.06.2013 Views

Cours 3 - XPath - IUT Bayonne

Cours 3 - XPath - IUT Bayonne

Cours 3 - XPath - IUT Bayonne

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!