Bases de Données XML : interrogation d'une base BaseX avec XQuery

Exploitation de données

L'un des grands intérêt de BaseX est l'exploitation de volumes importants de données fournis sous format XML ce qui le rend intéressant pour l'exploitation des données Open Data.

De nombreuses sources sont disponibles sur internet permettent d'obtenir des fichiers exploitables :

Pour cette exercice, nous allons exploiter les données sur les prix des carburants mises à disposition quotidiennement sur le site :

http://www.prix-carburants.economie.gouv.fr/rubrique/opendata/

Mise en place BaseX

  • Pour accéder à l'interface de BaseX, exécuter .../basex/bin/basexgui avec ./basexgui

Import du fichier XML

Après avoir téléchargé le fichier à l'adresse http://donnees.roulez-eco.fr/opendata/jour et en extraire le XML, il faut créer une nouvelle base à partir de ce fichier sous BaseX.

Pour cela :

  1. Database -> New (raccourci CTRL + N)

  2. Dans le champ input file or directory : browse => fichier xml téléchargé.

  3. OK

  4. La base est chargée !

1
for $station in //pdv
2
return $station 
3

Visualisation des données

Explorer le fichier XML grâce aux différentes vues de BaseX. Utiliser diverses représentations graphiques. Pour cela :

  1. Cliquer sur "Vizualisation"

  2. Selectionner une représentation

  3. Explorer les données

Question

Donner la liste des points de vente existant à Compiègne.

Indice

Exploiter le noeud ville renseigné pour chaque point de vente.

Indice

Utiliser l'instruction where et la fonction matches avec le flag i.

Solution

Solution

1
for $pdv in //pdv
2
where matches($pdv/ville, "compi[èe]gne", "i")
3
return $pdv

Question

Compter, pour chaque station présente à Compiègne, le nombre de service qu'elle offre et produire un XML de la forme :

1
<listeStation>
2
  <station id="$ID">
3
     <adresse> $Adresse </adresse>
4
     <nombreService> $NBService </nombreService>
5
   </station>
6
</listeStation>
Indice

Utiliser la fonction count et les expressions XPath pour les noeuds service.

Solution

Solution

1
<listeStation>
2
 {
3
   for $station in //pdv[@cp=60200]
4
   return <station>
5
            { $station/@id }
6
            {$station/adresse }
7
            <nombreService> {
8
                    count( $station/services/service) }
9
             </nombreService>
10
11
          </station>
12
 }
13
</listeStation>

Question

Donner le nombre de stations services qui proposent chaque type d'essence et le prix moyen.

1
<récapitulatif>
2
 <produit nom="$Variable1"> 
3
    <nombreStation> $NOMBRE_STATION </nombreStation> 
4
    <prixMoyen> $PRIX_MOYEN </prixMoyen>
5
 </produit>
6
</récapitulatif>
Indice

Penser à utiliser les clauses définies dans XQuery 3.0 comme group by

Indice

Il est possible d'itérer sur tous les éléments prix du fichier avec l'expression //pdv/prix.

Solution

Solution

1
<recapitulatif> 
2
{
3
 for $ess in //pdv/prix  
4
   let $produit := $ess/@nom 
5
   group by $produit 
6
   return <produit name="{$produit}">
7
    <nombreStation>  {count($ess)} </nombreStation>
8
    <prixMoyen> {avg($ess/@valeur)}</prixMoyen>
9
    </produit>
10
 }
11
</recapitulatif>
12
13
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Vincent Keller, Alexandre Mertz, 2015-2016 (Contributions : Stéphane Crozat, les étudiants de l'UTC) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)