Comme pour le TME sur XPath, BaseX se utilisé pour interroger les données.
Si ce n'est pas encore fait,
* Télécharger et décompresser, dans votre répertoire de travail, l'archive BaseX944.zip
Windows: cliquer sur l'icône **BaseX GUI** (ou lancer le script basexgui.bat)
Unix: exécuter bin/basexgui depuis le répertoire racine de basex
Après avoir lancé l'outil BaseX, commencer par créer une BD à partir d'un fichier XML. Pour ce faire, suivre les étapes suivantes :
1- aller dans le menu Database puis New. La fenêtre Create Database va s'ouvrir comme suit
2- Cliquer bouton Browse et sélectionner le fichier rencontre.xml pour charger le document dans la base.
Remarque Pour charger le contenu d'un repertoire, sélectionner le répertoire en question au lieu d'un fichier.
3- Activer l'affichage de la représentation arborescente. Pour ce faire, dérouler le menu Visualization et cliquer Tree. Le résultat est comme suit
4- Tester la requête ci-dessous et appuyer sur le triangle vert pour exécuter la requête. Les résultats de cette requete sont en rouge dans l'arbre original.
for $r in //rencontre return $r
Remarque 1 Il est évident que si le résultat de votre requete est un nouvel élément construit par copie d'autres éléments de votre document interrogé, les éléments de ce dernier ne seront pas coloriés.
Remarque 2 Pour (dé)commenter un paragraphe, sélectionner le paragraphe et saisir Ctrl-k
Pour cet exercice, utiliser les données Xmark contenues dans le fichier xmark10MB.xml. Les données Xmark sont synthétiques mais reflètent un scénario réel, celui des enchères.
Afin de faciliter la formulation des requêtes, vous pouvez vous appuyer sur structure globale du document XMark représentée ci-dessous ou sur la définition de schéma fournie en XSD
Il vous est demandé de formuler en XQuery les requêtes permettant de retourner les informations ci-dessous. Les résultats sont consultables sur la page Résultat requêtes Xmark.
Réponses
- Le nom de la personne dont l'identifiant est “person0”.
for $x in /site/people/person[@id="person0"] return $x/name
- La valeur initiale des trois premières enchères en cours.
for $x in /site/open_auctions/auction[position()<4] return <result id="{$x/@id}" >{$x/initial}</result>
- La valeur de la première et de la dernière augmentation effectuée sur les trois premières des enchères en cours, selon l'ordre des enchères défini dans les données xml (ne pas trier les enchères chronologiquement).
for $x in /site/open_auctions/auction[position()<4] return <result id="{$x/@id}" ><first>{$x/bidder[1]/increase/text()}</first><last>{$x/bidder[last()]/increase/text()}</last></result>
- Le nom et le prix des objets vendus à plus de 480.
for $x in //closed_auctions/auction, $y in //item where $x/price/text()>480 and $x/itemref/@item =$y/@id return <result>{ $y/name, $x/price}</result>
- Le nom des objets du continent africain
for $x in //regions/africa return $x/item/name
- Le nom des objets du continent africain avec leur prix de vente
for $x in //regions/africa/item for $y in //closed_auctions/auction where $x/@id=$y/itemref/@item return <res>{$x/name, $y/price}</res>
- Le nombre de personnes qui n'ont pas de page web (i.e. les personnes sans élément homepage)
count(for $p in //person where empty($p/homepage) return $p)
Ecrire en XQuery les requêtes sur la base tennis (fichiers joueur.xml, gain.xml, rencontre.xml).
Réponses
<tournois> { for $a in distinct-values(document("rencontre.xml")//rencontre/annee) sort by (.), $l in distinct-values(document("rencontre.xml")//rencontre[annee=$a]/lieutournoi) sort by (.) return <tournoi lieu="{$l/text()}" annee="{$a/text()}"/> } </tournois>
ou bien
<tournois> { for $l in distinct-values(document("rencontre.xml")//rencontre/lieutournoi), $a in distinct-values(document("rencontre.xml")//rencontre[lieutournoi=$l]/annee) order by $a, $l return <tournoi lieu="{$l/text()}" annee="{$a/text()}"/> } </tournois>
ou bien
<tournois> { for $a in distinct-values(document("rencontre.xml")//annee) sort by (.), $l in distinct-values(document("rencontre.xml")//lieutournoi) sort by (.) let $r:= document("rencontre.xml")//rencontre[annee=$a and lieutournoi=$l] where exists($r) return <tournoi lieu="{$l/text()}" annee="{$a/text()}"/> } </tournois>
<tournois> { for $a in distinct-values(document("rencontre.xml")//rencontre/annee) sort by (.) return for $l in distinct-values(document("rencontre.xml")//rencontre[annee=$a]/lieutournoi) sort by (.) let $r:= document("rencontre.xml")//rencontre[annee=$a and lieutournoi=$l] return <tournoi lieu="{$l/text()}" annee="{$a/text()}"> { for $j in document("joueur.xml")//joueur[nujoueur=$r/nugagnant or nujoueur=$r/nuperdant] return <participant nom="{$j/nom/text()}" prenom="{$j/prenom/text()}" /> } </tournoi> } </tournois>
<reponse> { for $a in distinct-values(document("rencontre.xml")//annee) sort by (.) return <annee valeur="{$a/text()}"> { for $j in document("joueur.xml")//joueur let $r := document("rencontre.xml")//rencontre[annee=$a and (nugagnant=$j/nujoueur or nuperdant=$j/nujoueur)], $nbt:= count(distinct-values($r/lieutournoi)) where $nbt > 0 {-- order by $nbt, $j/nom --} return <joueur nom="{$j/nom/text()}" tournois="{$nbt}"/> } </annee> } </reponse>
Poursuivre sur les questions de l'exercice 2 du TD en utilisant les données bib.xml. Pour ce faire, commencer par charger dans BaseX le fichier bib.xml en suivant les instructions décrites précédemment.