26
XPath XML Path Language Sébastien Laborie [email protected] Christian Sallaberry [email protected] Bibliographie o http://www.w3.org/XML/ o http://www.w3schools.com/xpath/ o http://bibliotheques.univ-pau.fr/live/livres- electroniques/edition-ENI o http://www.gchagnon.fr/cours/xml/index.html o http://www.w3.org/TR/xpath-datamodel/ o http://www.w3.org/TR/xpath-full-text-10-use-cases/ 2

Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie [email protected] Christian*Sallaberry

  • Upload
    others

  • View
    16

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 2: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 3: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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 »

Page 4: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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/

Page 5: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 6: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

XPath :  chemins

• Axes

11self = nœud courant = contexte

XPath :  chemins

12

• ancestor

self = nœud courant = contexte

Page 7: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

XPath :  chemins

13

• ancestor-or-self

self = nœud courant = contexte

XPath :  chemins

14

• attribute

self = nœud courant = contexte

Page 8: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

XPath :  chemins

15

• child

self = nœud courant = contexte

XPath :  chemins

16

• descendant

self = nœud courant = contexte

Page 9: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

XPath :  chemins

17

• descendant-or-self

self = nœud courant = contexte

XPath :  chemins

18

• following

self = nœud courant = contexte

Page 10: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

XPath :  chemins

19

• following-sibling

self = nœud courant = contexte

XPath :  chemins

20

• namespace

self = nœud courant = contexte

Page 11: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

XPath :  chemins

21

• parent

self = nœud courant = contexte

XPath :  chemins

22

• preceding

self = nœud courant = contexte

Page 12: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

XPath :  chemins

23

• preceding-sibling

self = nœud courant = contexte

XPath :  chemins

24

• self

self = nœud courant = contexte

Page 13: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 14: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 15: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 16: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 17: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

• 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

Page 18: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 19: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 20: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 21: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 22: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

• 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

Page 23: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

• 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

Page 24: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

Exercices  !

Recherche  d’information  

avec  XPath

47

Exercice  1  :  éditeur  oXygen

• Editez un premier document XML et l’interroger

48

Page 25: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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

Page 26: Bibliographieslaborie.perso.univ-pau.fr/images/Cours-XML/cours3-xpath.pdf · XPath XML(Path Language Sébastien*Laborie Sebastien.Laborie@iutbayonne.univ7pau.fr Christian*Sallaberry

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