1 3 Interrogation de documents XML Interrogation XML Valeur C - Module Données et Services sur le Web Bernd Amann 2003/04 Comment interroger des documents XML? XPath : extraction de fragments d arbres par des expressions de chemins SQL : il faut transformer le document XML en relations SQL + XPath : on stocke les documents sous forme d attributs de type XML et on manipule deux langages d interrogation XSLT : un programme XSLT crée une copie transformée d un document; le langage n est pas conçu pour le traitement de grands volumes de données; XQuery : vrai langage de requêtes pour l interrogration de grands ensembles de documents XML 2 4 Interrogation de documents XML XQuery
5 7 Langages de requêtes pour XML Expressions XQuery Des langages semi-structurées vers le langage XQuery : Langages de requêtes pour données semi-structurées : POQL de l INRIA (1996), UnQL de Penn. Univ. (1996), Lorel de Stanford Univ. (1997) 1998 : Workshop Query Languages 98 (QL 98) Langages de requêtes pour XML : XOQL (Xyleme), XML-QL, XQL, Lore,... XQuery est un langage fonctionnel (typé) : Une requête XQuery est une composition d expressions. Chaque expression retourne une valeur (ou une erreur). Les expressions n ont pas d effets de bord (mises-à-jour). Remarque : XQuery est très proche du langage OQL par son approche fonctionnel. XQuery : W3C Working Draft 02 May 2003 6 8 La place de XQuery dans le monde XML Expressions simples Modèles et Langages: Groupes de travail: Expressions (requêtes) simples : XML Schema XQuery XPath XML Schema XQuery XPath 2.0 XSLT Valeurs atomiques: 46 est une requête qui retourne l entier 46 Salut est une requête qui retourne la chaîne de caractères Salut. (Don Chamberlin) Valeurs construites par une fonction: true() retourne la valeur booléene true date( 2002-10-23 ) retourne une date
9 11 Expressions Complexes Séquences Expressions de chemins (XPath 2.0) Expressions FLWR (For-Let-Where-Return) : définition de variables Tests (If-Then-Return-Else-Return) Fonctions Racines :,, Fonctions prédéfinies : XQuery 1.0 and XPath 2.0 Functions and Operators Fonctions utilisateurs XQuery ne fait pas de distinction entre un item et une séquence de longueur 1 : 47 = (47) Une séquence peut contenir des valeurs hétérogènes : (1, toto, <toto/>) On ne peut pas construire des séquences imbriquées : (1, (2, 6), "toto", <toto/>) = (1, 2, 6, toto, <toto/>) Une séquence peut être vide : () Les séquences sont triées : (1,2) (2,1). 10 12 Le modèle de données de XQuery Opérations dans XQuery XQuery a son propre modèle de données (différent de DOM) : Une valeur est une séquence ordonnée (liste) d items. Opérateurs arithmétiques: 1+2, 3.4-6.5, $y mod 2 Un item est un noeud (DOM) ou une valeur atomique. Chaque noeud et chaque valeur a un type (XML Schema). Opérations sur les séquences : concaténation : l expression retourne la valeur noeud item valeur atomique valeur Le résultat d une requête XQuery est une valeur qui peut être transformée en séquence de fragments XML. * item union, intersection, différence... Opérateurs de comparaison pour valeurs atomiques, noeuds et séquences Opérateurs booléens: $x=2 and $y=4 or not($z) ($x, $y, $z sont des variables)
13 15 DTD Exemple: bib.dtd Expressions de chemins <!ELEMENT bib (book*) > <!ELEMENT book ((author)+, publisher, price) > <!ATTLIST book year CDATA #IMPLIED title CDATA #REQUIRED> <!ELEMENT author (la, fi )> <!ELEMENT la (#PCDATA )> <!ELEMENT fi (#PCDATA )> <!ELEMENT publisher (#PCDATA)> <!ELEMENT price (#PCDATA)> document("bib.xml")//author <author><la>amann</la><fi>b.</fi></author>, <author><la>rigaux</la><fi>p.</fi></author>, <author><la>rigaux</la><fi>p.</fi></author>, <author><la>scholl</la><fi>m.</fi></author>, <author><la>voisard</la><fi>a.</fi></author>, <author><la>abiteboul</la><fi>s.</fi></author>, <author><la>buneman</la><fi>p.</fi></author>, <author><la>suciu</la><fi>d.</fi></author> Le résultat est une séquence de noeuds XML! 14 16 Document Exemple: bib.xml <bib> <book title="comprendre XSLT"> <author><la>amann</la><fi>b.</fi></author> <author><la>rigaux</la><fi>p.</fi></author> <publisher>o Reilly</publisher> <price>28.95</price> </book> <book year="2001" title="spatial Databases"> <author><la>rigaux</la><fi>p.</fi></author> <author><la>scholl</la><fi>m.</fi></author> <author><la>voisard</la><fi>a.</fi></author> <publisher>morgan Kaufmann Publishers</publisher> <price>35.00</price> </book> <book year="2000" title="data on the Web"> <author><la>abiteboul</la><fi>s.</fi></author> <author><la>buneman</la><fi>p.</fi></author> <author><la>suciu</la><fi>d.</fi></author> <publisher>morgan Kaufmann Publishers</publisher> <price>39.95</price> </book> </bib> Expressions de chemins XPath 1.0 et XPath 2.0 XPath 1.0 : une expression de chemin est une suite d étapes séparées par / une étape est composé d un axe, d un filtre et d une séquence de prédicats XPath 2.0 (fonctionnel) : une expression de chemin est une suite d expressions d étapes une expression d étape est soit une étape XPath 1.0 (composé d un axe, filtre et de prédicats) ou une expression XQuery (simplifié)
17 19 Expressions de chemins : exemples Construction de noeuds XML doc( bib.xml )/bib//book[1]/publisher doc( bib.xml )//(book union author union publisher) : tous les livres, auteurs et editeurs doc( bib.xml )//book/(* except price) : pour chaque livre tous les éléments fils sauf le prix. doc( bib.xml )//book[every $a in author satisfies contains($a/la, a )] : tous les livres dont tous les auteurs ont la lettre a dans leur nom. Le nom et le contenu sont calculés: element { expr-nom } { expr-contenu } attribute { expr-nom } { expr-contenu } element { document("bib.xml")//book[1]/name(@*[1]) } { attribute { document("bib.xml")//book[1]/name(*[3]) } { document("bib.xml")//book[1]/*[3] } } <title publisher="o Reilly"/> 18 20 Construction de noeuds XML Différence de séquences de noeuds Le nom est connu, le contenu est calculé par une expression expr <auteurs> { document("bib.xml")//book[2]/author/la } </auteurs> <?xml version="1.0"?> <auteurs> <la>rigaux</la> <la>scholl</la> <la>voisard</la> </auteurs> Tous les sous-elements sauf les auteurs: { document("bib.xml")//book[1]/(* except author) } Tous les sous-elements sauf les auteurs: <publisher>o Reilly</publisher> <price>28.95</price> La requête fait partie d un document XML fragment XML! le résultat est transformé en
21 23 Concaténation de séquences Comparaison de valeurs atomiques : eq Le prix suivi des auteurs: { document("bib.xml")//book[1]/(price,author) } Le prix suivi des auteurs: <price>28.95</price> <author><la>amann</la><fi>b.</fi></author> <author><la>rigaux</la><fi>p.</fi></author> On a changé l ordre des noeuds ( union) document("bib.xml")//book/author[la eq "Scholl"] <author><la>scholl</la><fi>m.</fi></author> document("bib.xml")//book[author/la eq "Scholl"] ERROR On obtient une erreur car l expression author/la (dans le prédicat) retourne une séquence de longueur! 22 24 Transformation noeud valeur Comparaison de séquences : = "Les auteurs du premier livre sont", document("bib.xml")//book[1]/author/xf:string(la) Les auteurs du premier livre sont, Amann, Rigaux (xf:string est une fonction prédéfinie). Comparaison de séquences : = s il existe au moins un élément dans qui est égal à un élément dans (quantification existentielle). count(document("bib.xml")//book[author/la = ("Scholl", "Rigaux", "Abiteboul")]) 3
25 27 Comparaisons de noeuds (identité) : is Itération : for Comparaison de l identité de deux noeuds : is est identique à. document("bib.xml")//book[author[2] is author[last()]] <book title="comprendre XSLT"> <author><la>amann</la><fi>b.</fi></author> <author><la>rigaux</la><fi>p.</fi></author> <publisher>o Reilly</publisher> <price>28.95</price> </book> La clause for $var in exp affecte la variable $var successivement avec chaque item dans la séquence retournée par exp. for $a in document("bib.xml")//author[la eq "Voisard"] return $a <author><la>voisard</la><fi>a.</fi></author> 26 28 Comparaisons par la position : Affectation d ensembles: let Comparaison de la position de deux noeuds :<< apparaît avant dans le document. { document("bib.xml")//book[author[la="abiteboul"] << author[la="suciu"]]/@title } <livre title="data on the Web"/> La clause let $var := exp affecte la variable $var avec la séquence entière retournée par exp. for $b in document("bib.xml")//book[1] let $al := $b/author return <livre nb_auteurs="{count($al)}"> { $al } <livre nb_auteurs="2"> <author><la>amann</la><fi>b.</fi></author> <author><la>rigaux</la><fi>p.</fi></author>
29 31 Sélection: where Quantification La clause where exp permet de filtrer le résultat par rapport au résultat booléen de l expression exp (= prédicat dans l expression de chemin). { for $a in document("bib.xml")//book where $a/author[1]/la eq "Abiteboul" return $a/@title } <?xml version="1.0"?> <livre title="data on the Web"/> 30 some $var in expr1 satisfies expr2 il existe au moins un nœud retourné par l expression expr1 qui satisfait l expression expr2 (quantification existentielle). every $var in expr satisfies expr tous les nœuds retournés par l expression expr1 satisfont l expression expr2 (quantification universelle) for $a in document("bib.xml")//author where every $b in document("bib.xml")//book[author/la = $a/la] satisfies $b/publisher="morgan Kaufmann Publishers" return string($a/la) Scholl, Voisard, Abiteboul, Buneman, Suciu 32 Tests: if-then-else Trier avec order by <livres> { for $b in document("bib.xml")//book where $b/author/la = "Rigaux" return if ($b/@year > 2000) then <livre recent="true"> {$b/@title} else {$b/@title} } </livres> <?xml version="1.0"?> <livres> <livre title="comprendre XSLT"/> <livre recent="true" title="spatial Databases"/> </livres> expr1 order by expr2 (ascending descending)? : trier les éléments de la séquence retournée par l expression expr1 par les valeurs retournées par expr2. <livres>{ for $b in document("bib.xml")//book order by $b/@year return { $b/@title, $b/@year } } </livres>
33 35 Jointure Jointure: Résultat Fichier d adresses: <addresses> <person> <name>amann</name> <country>france</country> <institution>cnam</institution> </person> <person> <name>scholl</name> <country>france</country> <institution>cnam</institution> </person> <person> <name>voisard</name> <country>germany</country> <institution>fu Berlin</institution> </person> </addresses> <livre titre="comprendre XSLT"> <auteur nom="amann" institut="cnam"/> <auteur nom="rigaux"/>, <livre titre="spatial Databases"> <auteur nom="rigaux"/> <auteur nom="scholl" institut="cnam"/> <auteur nom="voisard" institut="fu Berlin"/>, <livre titre="data on the Web"> <auteur nom="abiteboul"/> <auteur nom="buneman"/> <auteur nom="suciu"/> 34 36 Jointure: Requête Fonctions et opérateurs Les fonctions et opérateurs permettent : for $b in document("bib.xml")//book return element livre { attribute titre {$b/@title}, for $a in $b/author return element auteur { attribute nom {$a/la}, for $p in document("addr.xml")//person where $a/la = $p/name return attribute institut {$p/institution} } } l accès au type et le nom d un noeud, la construction, la comparaison et la transformation de valeurs, l agrégation des valeurs d une séquence. Les fonctions et opérateurs sont typés (XML schema) et manipulent des séquences et des valeurs typées (XML schema) : entiers, chaînes de caractères, dates,...
37 39 Exemple : Fonction avg Définition de Fonctions XQuery permet à l utilisateur de définir ses propres fonctions. for $p in distinct-values(document("bib.xml")//publisher) let $l := document("bib.xml")//book[publisher = $p] return element publisher { attribute name {string($p)}, attribute avg_price { xf:avg($l/price) }} Résultat : <publisher name="o Reilly" avg_price="28.95"/>, <publisher name="morgan Kaufmann Publishers" avg_price="37.48"/> define function NombreAuteurs(book $b) returns xsd:integer { return count($b/author) } Le résultat est de type xsd:int. 38 40 Exemple: index-of Modèle abstrait d un traitement XML <books> { let $bl := document("bib.xml")//book for $b in $bl return <book> { $b/@title, attribute no {index-of($bl, $b)}} </book> } </books> <?xml version="1.0"?> <books> <book title="comprendre XSLT" no="1"/> <book title="spatial Databases" no="2"/> <book title="data on the Web" no="3"/> </books> Document XML Schéma XML XML PSV Parseur XML Infoset Validateur Infoset Remplacement entités Insertion de valeurs par défaut Document bien formé Document valide PSV: Post schema validated Infoset (avec annotations de types) XQuery Modèle de données Résultat
41 Modèle abstrait d un traitement XML Les éléments et les attributs sont annotés par un type (XMLSchema). Chaque noeud a un type XML Schema ou inconnu ( anysimpletype ) Exemples de valeurs et de leurs types : 47 xsd:int (1, 2, 3) xsd:int, xsd:int, xsd:int (47, toto ) xsd:int, xsd:string <a/> element a {()} <a>toto</a> element a {text} 42 Plus d informations... Site du W3C sur XQuery: http://www.w3.org/xml/query P. Wadler, XQuery: a typed functional language for querying XML J. Siméon et P. Wadler, The Essence of XML Galax: db.bell-labs.com/galax/ GMD IPSI XQuery