Intro. XML/XQuery (Ingemedia)
L’objectif de ce TD est de découvrir XQuery, il ne s’agit que d’une introduction mais à l’issue de ces quelques exercices l’interrogation avancées de documents XML (ou JSON) sera déjà possible. Des supports de cours se trouvent dans la partie Enseignement/Intranet après connexion avec vos identifiants de l’UTLN, ils ne sont pas nécessaire pour suivre ce TD.
Etude pratique d'un document XML
Pour cette partie pratique le document exemple du livre “XQuery pour interroger des données XML” sera utilisé : queyras.xml
Première approche de XQuery
Un login et un password vous seront donnés en cours. Vous pouvez vous en servir pour éditer des documents et des requêtes. Il est aussi possible de les sauvegarder après vous être connecté.
Les expressions simples
Les expressions XQuery les plus simples des valeurs littérales :
- Des chaînes de caractères :
“Secteur de St-Véran”
- Des nombres :
2005
3.14
1.602e-19
1.602E-19
- Des booléens :
true()
etfalse()
Il est aussi possible d’évaluer des expressions arithmétiques avec les opérateurs classique (à part le /
pour la division qui est remplacé par div
).
Un document XML est aussi une expression qui a comme valeur ce document. Il est possible d’indiquer qu’une fragment de document est une expression XQuery en la mettant entre { et }
<a>1<b>2</b></a>
<a x='{1+2}'>{3*4}</a>
Séquences
XQuery ne manipule que des séquences plate (une liste ordonnée) d’items (des littéraux ou des noeuds XML). L’évaluation d’une requête retourne une séquence. Il est possible de créer des séquences avec les opérateurs ()
et ,
. http://lsis.univ-tln.fr/~bruno/enseignement/xml/xml
Quelques exemples : ()
(1,2,“a”,<a><b/></a>)
<Note>Que se passe-t-il si l’on imbrique deux séquences ?</Note>
Variables
Il est possible définir des variables pour l’évaluation d’une requête.
let $x := 3, $y := 2 return $x + $y
<Note>Modifier votre requête qui crée un document XML pour qu’elle utilise des variables</Note>
Bibliothèque de fonctions
Il est existe une bibliothèque de fonctions http://www.w3.org/TR/xpath-functions/
Pour le moment citons fn:doc()
qui retourne le nœud racine d’un document par exemple fn:doc(“queyras.xml”)
.
Interrogation d'un arbre XML
Nous allons voir maintenant la forme la plus simple de l’interrogation d’un arbre XML : Un pas dans un arbre à la forme suivante :
axe::test-de-nœud prédicat1 ... prédicatn
A partir d’une séquence de nœuds (par exemple après l’appel de fn:doc
) une nouvelle séquence est produite : pour chaque nœud de la séquence d’origine, on suit l’axe (cf détail ci dessous) et on en garde que les nœuds pour lesquels le test (cf. ci dessous) et les prédicats sont successivement vrais.
Si aucun axe n’est précisé c’est l’axe child
qui est utilisé.
declare default element namespace "http://mes-guides-randos";
Quelques exemples :
fn:doc(“http://bruno.lsis.univ-tln.fr/_media/enseignement/xml/queyras.xml”)/descendant::secteur
fn:doc(“http://bruno.lsis.univ-tln.fr/_media/enseignement/xml/queyras.xml”)/descendant::itinéraire
fn:doc(“http://bruno.lsis.univ-tln.fr/_media/enseignement/xml/queyras.xml”)/descendant::itinéraire/nom/text()
fn:doc(“http://bruno.lsis.univ-tln.fr/_media/enseignement/xml/queyras.xml”)/child::guide/child::secteur/child::nom
Il est aussi possible de copier le document XML exemple dans exist et d’utiliser un chemin local/
fn:doc(“/db/ingemedia/queyras.xml”)/guide/secteur/nom
<Note>Tester les exemples précédents. Trouver (i) tous les paragraphes et (ii) toutes les altitudes. Mettez ces résultats dans un élément XML Résultat
</Note>
Les axes
- l’axe self qui contient le nœud contexte ;
- l’axe child qui contient les enfants du nœud contexte ;
- l’axe descendant qui contient les descendants du nœud contexte, c.-à-d. les enfants du nœud contexte et leurs descendants ;
- l’axe descendant-or-self qui contient le nœud contexte et ses descendants ;
- l’axe parent qui contient le parent du nœud contexte ;
- l’axe ancestor qui contient les ancêtres du nœud contexte ;
- l’axe ancestor-or-self qui contient le nœud contexte et ses ancêtres ;
- l’axe preceding-sibling qui contient les frères et sœurs du nœud contexte qui apparaissent avant le nœud contexte dans l’ordre du document mais qui est vide si le nœud contexte est un nœud attribut ;
- l’axe following-sibling qui contient les frères et sœurs du nœud contexte qui apparaissent après le nœud contexte dans l’ordre du document mais qui est vide si le nœud contexte est un nœud attribut ;
- l’axe preceding qui contient les descendants de la racine de l’arbre auquel appartient le nœud contexte qui apparaissent avant le nœud contexte dans l’ordre du document, excepté les ancêtres du nœud contexte ;
- l’axe following qui contient les descendants de la racine de l’arbre auquel appartient le nœud contexte qui apparaissent après le nœud contexte dans l’ordre du document, excepté les descendants du nœud contexte ;
- l’axe attribute qui contient les nœuds attribut dont le parent est le nœud contexte.
Les test de noeuds
Dans le cadre de cette première approche un test de nœud sera soit un test sur le nom du nœud (on donne le nom des éléments ou des attributs à conserver en fonction de l’axe), soit un test sur la sorte (node(), element(), text(), …)
Comparaison
Il y a trois types d’opérateurs de comparaisons
- les opérateurs de comparaison de valeurs qui sont les opérateurs classiques qui comparent des valeurs atomiques de façon stricte (
eq
,ne
,lt
,le
,gt
etge
) ; - les opérateurs de comparaison générale qui comparent des valeurs de façon plus flexible,
par exemple, deux séquences seront considérées comme égales si l’une contient un
item égal à un item contenu dans l’autre ; (=
, !=
, <
, …)
- les opérateurs de comparaison de nœuds qui comparent des nœuds par rapport à leur
identité où à leur rang dans l’ordre du document ( is
même noeud, «
avant et »
après).
3 eq 4
“a” eq “b”
- (“a”,“b”) = (“b”)
fn:doc(“queyras.xml”)/guide/secteur/nom = “Secteur de la Durance”
let $doc:=fn:doc("queyras.xml")/guide return $doc/éditeur >> $doc/auteur and $doc/année << $doc/titre
<Note>Expliquer et tester les comparaisons précédentes</Note>
le FLWOR
FLWOR (http://www.w3.org/TR/xquery/#id-flwor-expressions), qui se prononce ”flower”, est un acronyme pour for-let-where-order by-return. L’expression FLWOR est à XQuery ce que l’expression select-from-where-order by est à SQL.
En n’utilisant que les clauses for
et return
, on peut le voir comme une sorte de boucle sur les séquences.
for $i in fn:doc("queyras.xml")//itinéraire return $i/nom
L’utilisation de la clause let
permet de définir des variables utilisables dans les clauses suivantes.
for $i in fn:doc("queyras.xml")//itinéraire let $a := $i/alt return <iti nom="{$i/nom}" alt="{$a}"/>
L’utilisation de la clause where
permet de filtrer les résultats
for $i in fn:doc("queyras.xml")//itinéraire let $a := $i/alt where $i/../nom = "Secteur de Ceillac" return <iti nom="{$i/nom}" alt="{$a}"/>
La clause order by
permet d’indiquer quel est le critère de tri.
for $i in fn:doc("queyras.xml")//itinéraire let $a := $i/alt where $i/../nom = "Secteur de Ceillac" order by $a return <iti nom="{$i/nom}" alt="{$a}"/>
Il est bien sur possible de les “imbriquer”
for $s in fn:doc("queyras.xml")//secteur for $i in $s/itinéraire order by $s/nom, $i/nom return <iti-sec iti="{$i/nom}" sec="{$s/nom}"/>
A vous de jouer
Après cette présentation très rapide de XQuery vous pouvez maintenant écrire vos propres requêtes pour répondre aux questions suivantes :
- La liste des noms d’itinéraires triés par cotation
- La liste des secteurs comportant un itinéraire dont l’altitude d’arrivée est supérieurs à 3000 m.
- La liste des itinéraires comportant une note de prudence
- Une liste d’éléments XML qui présente pour chaque secteur la moyenne des altitudes des itinéraires
Pour aller plus loin
- La production de document XHTML est immédiate : proposez une présentation XHTML du résultat de l’une des requêtes (en réalité, il possible d’associer du CSS directement à un document XML).
- Il est aussi possible de produire de nombre autre formats par simple transformation : des images vectorielles (SVG), des documents bureautique (opendocument), …
Pour préparer le dernier TD
Ce travail est à rendre par groupes de 3 maximum le 28/11/2014.
- Trouver une source de documents XML (http://data.nantes.fr ou https://www.data.gouv.fr) pertinente.
- Présenter son intérêt dans le cadre de la réutilisation de données et donner une idée d’application
- Ecrire des requêtes XQuery pour réaliser la réutilisation :
- Extraire des données
- Reconstruire de nouvelles données
- En option vous pouvez construire des données dans un format standard :
- produire un document XHTML (par exemple un tableau de présentation des données)
- produire une image SVG (Un histogramme, ….)
~~DISCUSSION~~
—- dataentry page —- type : Enseignement level : main enseignement_tags : Ingemedia promotion : Infocom technologies_tags : XMLM,XQuery,Zorba