Table des matières

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

Regarder ce document, et décrire sa structure générale sous la forme d’un arbre. Cela facilitera ensuite l’interrogation

Première approche de XQuery

En TP, nous utiliserons eXist-db, une base de données XML https://exist.lsis.univ-tln.fr/exist/apps/eXide/index.html

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 :

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).

Ecrivez quelques requêtes simples utilisant des littéraux et des expressions arithmétiques

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 }

Ecrivez une requête qui fabrique un document XML simple

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é.

Attention, comme le document XML utilise un espace de nom. Il faut le déclarer (ici par défaut) en ajoutant avant chaque requête :
declare default element namespace "http://mes-guides-randos";

Quelques exemples :

Il est aussi possible de copier le document XML exemple dans exist et d’utiliser un chemin local/

<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

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

par exemple, deux séquences seront considérées comme égales si l’une contient un item égal à un item contenu dans l’autre ; (=, !=, <, …)

identité où à leur rang dans l’ordre du document ( is même noeud, « avant et » après).

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 :

Pour aller plus loin

Pour préparer le dernier TD

Ce travail est à rendre par groupes de 3 maximum le 28/11/2014.

~~DISCUSSION~~

—- dataentry page —- type : Enseignement level : main enseignement_tags : Ingemedia promotion : Infocom technologies_tags : XMLM,XQuery,Zorba