Vous êtes sur la page 1sur 7

Plan de la séance

Le langage de requêtes XQuery


L3Pro BDISE – XML XQuery

M. Sassolas
L3Pro
Mathieu Sassolas Cours 5 1 Pourquoi un langage de requêtes ?
Motivation
IUT de Sénart Fontainebleau
Département Informatique Syntaxe
2 Syntaxe de XQuery
Exemples

Année 2016-2017 Utilisation

Cours 5 Mise en 3 Quelques exemples


application

4 Question philosophique : quand utiliser XQuery ?

5 Mise en application

2 / 21

XML comme une base de donnée Extraction via XSLT

XQuery XQuery
I On peut le faire par XSLT :
M. Sassolas I On peut voir un document XML comme une base de M. Sassolas
L3Pro L3Pro

Cours 5
donnée : Cours 5

Motivation ... Motivation

Syntaxe <person id="jcd00001"> Syntaxe

Exemples <prenom>Jean-Claude</prenom> Exemples

Utilisation <nom>Dusse</nom> Utilisation

Mise en
application
<age>55</age> Mise en
application
<hobby>Conclure</hobby>
</person>
... (Mais ce n’est pas très beau.)
I Ça ne devient utile que si on fait vraiment des traitements
I On veut pouvoir extraire des informations de cette base :
dessus.
équivalent de
SELECT * FROM personne WHERE hobby="Conclure";
3 / 21 4 / 21 On veut de vraies requêtes comme en SQL.
Expressions FLWOR for $variable in expression
Partie I

I La variable $variable prendra tour à tour la valeur des


XQuery XQuery

M. Sassolas M. Sassolas
L3Pro L3Pro
éléments sélectionnés par l’expression.
Cours 5 for $variable in expression Cours 5 I L’expression est en général une requête XPATH (simple).
Motivation let $variable := expression Motivation

Syntaxe where condition Syntaxe Attention !


Exemples order by expression Exemples L’arbre XML dans lequel on se place (notre « base de
Utilisation
return expression Utilisation données ») n’est pas défini a priori (comme c’est le cas en
Mise en
application
Mise en
application
XSLT puisque c’est le XML qui appelle la feuille XSLT) .

Remarques
Récupération de la racine d’un arbre XML
I Seul le return est obligatoire.
doc("chemin/vers/le/fichier.xml")
I On peut imbriquer des expressions dans d’autres.

Exemple
5 / 21 6 / 21 For $p in doc("../films/lesBronzes.xml")/personne

for $variable in expression let $variable := expression


Partie II

XQuery XQuery

M. Sassolas M. Sassolas
L3Pro L3Pro

Cours 5 I Itérations numériques : for $i in (1 to 42). Cours 5

Motivation I Comptage de l’itération (sur un ensemble de nœuds) : Motivation

I Assignation de variable.
Syntaxe Syntaxe
for $noeud at $i in doc("arbre.xml")/truc.
Exemples Exemples

Utilisation
I Produits cartésiens : Utilisation I Exemple : let $persId := $p/@id
Mise en
for $x in (1 to 5), $y in (4 to 21). Mise en I La variable peut aussi avoir comme valeur un (bout
application application
d’)arbre XML.
Remarque
Les nœuds sélectionnés pourraient l’être finement avec une
requête XPath adaptée. La philosophie de XQuery est de plutôt
laisser cela aux conditions du where.

7 / 21 8 / 21
where condition order by expression

XQuery XQuery

M. Sassolas M. Sassolas

I C’est ici que se fait la majorité du « filtrage ».


L3Pro L3Pro

Cours 5 Cours 5

Motivation I Les conditions sont les mêmes que les tests XPath. Motivation I Définit le critère pour ordonner le parcours d’une boucle
Syntaxe
I Exemple : where number($p/age) > 42 Syntaxe for.
I On peut inverser l’ordre avec descending ; le cas
Exemples Exemples

Utilisation
I Remarque : la requête n’est pas du XML on utilise les Utilisation
chevrons et non les entités. ascending est implicite.
Mise en Mise en
application application
I On peut donner plusieurs critères en les mettant à la suite.
Condition quantifiée I Exemple : order by number($p/age) descending,
I where every $x in $ensemble satisfies cond_x $p/nom.
I where some $x in $ensemble satisfies cond_x

9 / 21 10 / 21

return expression Enrobage

XQuery XQuery

M. Sassolas M. Sassolas
L3Pro
I C’est là qu’est réelement produit quelque-chose. L3Pro

I On peut insérer la requête dans du XML (ou du


Cours 5 Cours 5

I Ce qui est produit peut être a priori n’importe quel code


Motivation Motivation
XML. XHTML. . .).
Syntaxe Syntaxe

Exemples I Pour évaluer des expressions, on les met entre accolades. Exemples Exemple
Utilisation Utilisation
<nouvel_arbre>{
Mise en Exemple Mise en
application application for $x in doc("vieil_arbre.xml")/noeud
return <personnage>{concat($p/prenom," ",$p/nom," return <truc>{$x/contenu}</truc>
(",$p/age," ans)")}</personnage> }</nouvel_arbre>
I Commentaires XQuery : (: Du commentaire :).
On manipule toujours des bouts d’arbre XML.

11 / 21 12 / 21
Fonctions Exemple complet

XQuery ,→ On peut utiliser toutes les fonctions XPath. XQuery

M. Sassolas
L3Pro
I Fonctions sur les chaı̂nes de caractères : concat, M. Sassolas
L3Pro

Cours 5 contains. . . Cours 5


<cadeaux>
Motivation I Fonctions sur les nombres : div, +. . . Motivation
{
Syntaxe
I number(...) traite les données comme des nombre. Très Syntaxe
for $boite in
Exemples Exemples
utile dans les order by ou dans des comparaisons dans un doc("RoisMages.xml")/rois_mages/chameau/boite
Utilisation Utilisation
where. order by number($boite/objet/@poids)
Mise en Mise en
application I data(...) récupère les données textuelles application return <objet dest="{$boite/destinataire}">
(« #PCDATA ») du nœud (à comparer avec text() de {$boite/@id}{data($boite/objet)}</objet>
XPath, sauf qu’il descend dans les fils). Exemples : }
data($p/nom) ; data($var/@attribut). </cadeaux>
I distinct-values(. . .) retire les doublons ; très utile dans les
boucles for.
I exists(. . .) teste l’existence de nœuds ; très utile dans les
13 / 21 14 / 21
tests where.
<?xml version="1.0" encoding="UTF-8"?>
<cadeaux>
jet>
Exemple complet
<objet dest="Anthony" id="r492">Une brosse à dents</ob
<objet dest="Benjamin" id="l636">Un camembert Président
</objet> Imbrication d’expression
<objet dest="Benjamin" id="j325">Un stylo</objet>
<objet dest="Billal" id="p562">Un cahier</objet>
les odeurs</objet>
<objet dest="Samuel" id="r362">Un bel aérateur pour bouffer
<objet dest="Billal" id="w913">Des bo^ ıtes en plastique</objet>
XQuery </objet> XQuery
<objet dest="Anthony" id="g721">Des draps qui chauffent
<objet dest="Samuel" id="j629">Un cire-godasse</objet>
M. Sassolas M. Sassolas
<objet dest="Mohamed" id="g720">Un barbecue</objet>
L3Pro
<objet dest="Anthony" id="k430">Un allume barbecue</objet> L3Pro <liste_references>
<objet dest="Mohamed" id="y626">Des tas de couverts</objet>
Cours 5
<cadeaux>
<objet dest="Benjamin" id="a256">Des pelles à g^ ateaux</objet>
Cours 5
{
objet>
Motivation <objet dest="Didier" id="a316">Un pistolet à gaufres</ Motivation let $boitsage :=
{ <objet dest="Billal" id="r312">Un coupe-friture</objet>
Syntaxe <objet dest="Samuel" id="f920">Un téléphone</objet> Syntaxe for $pers in
for $boite in
<objet dest="Anthony" id="z245">Un écran plat</objet>
Exemples <objet dest="Luc" id="e162">Un atomixer</objet> Exemples doc("RoisMages.xml")/rois_mages/enfants/sage,
<objet dest="Math ieu" id="z362">Du jus d’ananas</objet>
doc("RoisMages.xml")/rois_mages/chameau/boite
<objet dest="Luc" id="k257">Un tabouret à glace</objet>
Utilisation <objet dest="Mohamed" id="k731">Une tente Quechua</objet> Utilisation $cad in doc("RoisMages.xml")/rois_mages/chameau/boite
order by number($boite/objet/@poids)
<objet dest="Selma" id="m692">Une tourniquette pour faire
la vinaigrette</objet>
where $cad/destinataire = $pers
Mise en Mise en
<objet dest="Mohamed" id="m426">Un évier en fer</objet>
application return <objet dest="{$boite/destinataire}">
<objet dest="Mathieu" id="z362">Du jus d’ananas</objet>
application return $cad
<objet dest="Samuel" id="z481">Un repasse-limaces</objet>
{$boite/@id}{data($boite/objet)}</objet>
<objet dest="Mohamed" id="e361">Du lait UHT</objet>
for $cado in $boitsage
t>
<objet dest="Selma" id="l352">Plein d’objets sans fil</obje order by $cado/destinataire
} <objet dest="Benjamin" id="p962">Un chasse filou</objet>
<objet dest="Régine" id="h252">Une armoire à cuillère<
</cadeaux>
/objet> return <reference>{data($cado/@id)}</reference>
<objet dest="Anthony" id="d073">Du Dunlopillo</objet>
<objet dest="Mathieu" id="j212">Un ratatine-ordures</objet> }
<objet dest="Mohamed" id="n362">Un rottweiler</objet> </liste_references>
<objet dest="Régine" id="g362">Un frigidaire</objet>
<objet dest="Didier" id="q729">Un po^ele à mazout</objet>
<objet dest="Billal" id="e622">Une cuisinière</objet>
<objet dest="Benjamin" id="w425">Un four en verre</objet>
14 / 21 <objet dest="Benjamin" id="x526">Un joli scooter</objet> 15 / 21
et>
<objet dest="Anthony" id="t092">Un avion pour deux</obj
</cadeaux>
Utilisation de plusieurs « bases de données »
<?xml version="1.0" encoding
="UTF-8"?>
Imbrication <lis
d’expression
te_references>
<referen . . . et d’autres fonctionnalités de XQuery
ce>n362</reference>
<reference>m426</reference>
<reference>z245</reference>
XQuery <reference>d073</reference> XQuery <taux_reussite>{
<reference>g720</reference> let $profs := for $c in doc("courses-noID.xml")//Course/Instructors/*
M. Sassolas M. Sassolas
<ref erence>r362</reference> order by $c/Last_Name, $c/First_Name
L3Pro <liste_references> L3Pro
return $c
<reference>e361</reference>
Cours 5
{ <reference>t092</reference>
Cours 5
for $ens in distinct-values($profs)
Motivation let $boitsage <ref
:= erence>l636</reference> Motivation let $cours :=
for $catalog in doc("courses-noID.xml")//Course
Syntaxe for $pers in<reference>p962</reference> Syntaxe
<reference>e622</reference> where $catalog/Instructors/* = $ens
Exemples doc("RoisMages.xml")/rois_mages/enfants/sage, Exemples return data($catalog/@Number)
<reference>r312</reference>
Utilisation $cad in doc("RoisMages.xml")/rois_mages/chameau/boite
<reference>w913</reference> Utilisation let $taux :=
where $cad/destinataire
<reference>g721<= $pers for $catalog in doc("courses-noID.xml")//Course,
Mise en /ref erence> Mise en
<ref eren $stat in doc ("courses-noID-stats.xml")//Course
application return $cad ce>k731</reference> application
where $catalog/@Number = $stat/@Number (: jointure :)
<reference>y626</reference>
for $cado in <ref
$boitsage and $catalog/Instructors/* = $ens
erence>f920</reference>
order by $cado/destinataire
<reference>z481</reference> return <cours nom="{data($catalog/@Number)}">{
return <reference>{data($cado/@id)}</reference>
<reference>j325</reference> number(data($stat/Enrolled))
<reference>a256</reference> div number(data($stat/Passed))}
} </cours> (: du XML pour pouvoir le relire ensuite :)
<reference>p562</reference>
</liste_references>
<reference>x526</reference> return <enseignant><identite>{data($ens)}</identite>
<reference>r492</reference> {for $tx in $taux
<reference>j629</reference> return <taux Course="{data($tx/@nom)}">{data($tx)}</taux>}
15 / 21 </liste_references> 16 / 21 </enseignant>
}</taux_reussite>

<?xml version="1.0" encoding


Utilisation de plusieurs « bases de données » Utilisation de plusieurs « bases de données »
<?xml version="1.0" encoding="UTF-8"?> ="UTF-8"?>
<taux_reussite>
<enseignant>
. . . et d’autres fonctionnalités
<Course _Statistics>de XQuery . . . et d’autres fonctionnalités de XQuery
<identite>
<Course Number="CS106A"> Alex
XQuery <taux_reussite>{
<Enrolled>147</Enrolled> XQuery <taux_reussite>{ S.
let $profs := <Passed
for $c >68</Pa
in doc("courses-noID.xml")//Course/Instructors/*
ssed> let $profs :=Aike forn$c in doc("courses-noID.xml")//Course/Instructors/*
M. Sassolas
order by
<Credit $c/Last_Name,
s>3</Cr edits> $c/First_Name M. Sassolas </id entite>
order by $c/Last_Name, $c/First_Name
L3Pro
returne> $c
L3Pro <taux return
Course="$cCS143">1.1873198847262247</taux>
</Cours
Cours 5
for $ens in distinct-values($profs) Cours 5
for </en
$ensseig
in nant >
distinct-values($profs)
Motivation let $cours<Course
:= Number="CS106B"> Motivation let <ens eign:=
$cours ant>
for $catalog ined>347<
<Enroll doc("courses-noID.xml")//Course
/Enrolled> for<ide ntite> in doc("courses-noID.xml")//Course
$catalog
Syntaxe Syntaxe Jerry
where $catalog/Instructors/*
<Passed>274</Passed> = $ens where $catalog/Instructors/* = $ens
Exemples return data($catalog/@Number)
<Credits>6</Credits> Exemples return R. data($catalog/@Number)
Utilisation let $taux </Cours
:= e> Utilisation let $taux := Cain
for $catalog in doc("courses-noID.xml")//Course, </identite>
for $catalog in doc("courses-noID.xml")//Course,
Mise en Mise en <tau x Cour
application $stat in doc
<Course ("courses-noID-stats.xml")//Course
Number= "CS107"> application $stat in se="
doc CS10
("courses-noID-stats.xml")//Course
6A">2.161764705882353</taux>
where $catalog/@Number = $stat/@Number (: jointure :) <tau$catalog/@Number
where x Course="CS106B"> = 1.26
$stat/@Number (:36</
jointure
<Enrolled>47</Enrolle d>
</en
642335766423 taux> :)
and $catalog/Instructors/*
<Passed>32</Passed>= $ens and seig nant>
$catalog/Instructors/* = $ens
return <cours nom="{data($catalog/@Number)}">{ <ens eign<cours
return ant> nom="{data($catalog/@Number)}">{
<Credit s>6</Credits>
number(data($stat/Enrolled))
e> <identitnumber(data($stat/Enrolled))
e>
</Cours
div number(data($stat/Passed))} William div number(data($stat/Passed))}
</cours> (: du "CS109"
<Course Number= XML pour
> pouvoir le relire ensuite :) J.
</cours> (: du XML pour pouvoir le relire ensuite :)
return <enseignant><identite>{data($ens)}</identite>
<Enrolled>124</Enrolled> Dally
return <enseignant><identite>{data($ens)}</identite>
{for $tx in $taux>107</Passed>
<Passed {for </id
$tx enti te>
in $taux
return <taux Course="{data($tx/@nom)}">{data($tx)}</taux>}
s>3</Credits> <taux <taux
return Course=" EE108B">1.437956204379562</t
Course="{data($tx/@nom)}">{data($tx)}</taux>}
<Credit aux>
</enseignant> </enseig nant>
</enseignant>
16 / 21 </Course> 16 / 21
}</taux_reussite> ...
}</taux_reussite>
...
XQuery vs XSLT XQuery vs XSLT
Deux paradigmes très différents, en image Quelques différences

I XQuery est fait pour extraire les données plus que pour les
XQuery XQuery

M. Sassolas Dans un navigateur M. Sassolas


L3Pro L3Pro
mettre en forme.
Cours 5
XML référence Cours 5 I L’exemple de requête sur courses-noID[-stats].xml
Motivation </> .xsl Motivation est en fait très mauvais : on fait de la mise en forme et des
Syntaxe XML Syntaxe calculs qui seraient plus propres en XSLT.
</>
Exemples Exemples I L’idéal est d’utiliser les deux en séquence : XQuery fait la
Utilisation « nouvel » XML Utilisation jointure puis XSLT met en forme :
Mise en Mise en
application XML application
HTML
</>
XML </>
XML
</> .xsl ou
XML
</> produit
lit </>
lit
nouvel XML transforme produit fini
lit XML XML
XML produit XML </> .xq </>
</> .xq </> lit produit
lit
17 / 21 18 / 21 nouvel XML

...
<Course Number="CS106A">
Exemple de jointure simple Exemple de jointure simple
<Title>Programming Methodology</Title>
<Description>
Introduction to the engineering of computer
XQuery XQuery applications emphasizing modern software
<Course_Catalog_With_Stats>{ <Course_Catalog_With_Stats>{
engineering principles.
M. Sassolas M. Sassolas
</Description>
L3Pro for $d in doc("courses-noID.xml")//Department L3Pro for $d in ctors>
doc("courses-noID.xml")//Department
<Instru
Cours 5
return Cours 5
return <Lecturer>
Motivation <Department>{$d/@Code} Motivation <First_Name>Jerry</First_Name>
<Department>{$d/@Code}
<Middle_Initial>R.</Middle_Initial>
Syntaxe {$d/Title} Syntaxe {$d/Title} <Last_Name>Cain</Last_Name>
Exemples {$d/Chair} Exemples {$d/Chair} rer>
</Lectu
Utilisation Utilisation <Professor>
{ { <First_Name>Eric</First_Name>
Mise en Mise en
application for $c in $d/Course, application for $c in ame>Roberts</Last_Name>
$d/Course,
<Last_N
</Professor>
$stat in doc ("courses-noID-stats.xml")//Course $stat in doc ("courses-noID-stats.xml")//Course
<Professor>
where $c/@Number = $stat/@Number (: jointure :) where $c/@Number
<First_Name>Me=hran</F
$stat/@Number
irst_Name> (: jointure :)
<Last_N ame>Sah ami</Last_Name>
return return
</Professor>
<Course>{$c/@Number}{$c/*}{$stat/*}</Course> <Course>{$c/@Number}{$c/*}{$stat/*}</Course>
</Instructors>
} } <Enrolled>147</Enrolled>
<Passed>68</Passed>
</Department> </Department>
<Credits>3</Credits>
19 / 21 }</Course_Catalog_With_Stats> 19 / 21 }</Course_Catalog_With_Stats>
</Course>
...
Compilation Fin du cours

XQuery XQuery

M. Sassolas M. Sassolas
L3Pro L3Pro

Cours 5 Cours 5

Motivation
Syntaxe Motivation

Syntaxe Syntaxe

ë C’est l’heure du TP ê
saxon-xquery -o:fichierProduit.xml requete.xq
Exemples Exemples

Utilisation Utilisation

Mise en Mise en
application Rappel application

Les fichiers XML servant de bases de données sont référencés


dans le .xq, donc pas passés comme arguments de la ligne de
commande.

20 / 21 21 / 21

Vous aimerez peut-être aussi