TP BDAV - XPath

Préliminaires

Interface XPath/XQuery

Pour lancer l'interface XQuery, cliquer sur le lien si dessus. Dans le cas où le navigateur vous demande avec quoi ouvrir le fichier, choisir “Java Web Start” ou javaws.exe

Il s'agit simplement d'une interface graphique utilisant la bibliothèque Saxon pour traiter les requêtes XQuery. L'interface est composée de trois zones de texte principales: une pour le document XML à traiter, une pour le programme XQuery et une dans laquelle s'affiche le résultat. Sur la gauche, il y a une liste de documents XML disponibles. Double cliquez sur un document pour le charger dans la zone de données. Il est également possible de charger un document du serveur en saisissant l'url dans la petite zone de texte en haut. Le bouton “XQuery” permet de lancer la requête XQuery de la zone “Programme”. Le bouton “XSLT” (non utilisé dans ce TP) permet d'appliquer une feuille de style XSLT donnée dans la zone programme sur le document de la zone “Données”. Il est en particulier possible de l'utiliser pour afficher les DTDs de certains des documents de la base. Les racourcis claviers classiques fonctionnent dans les zones de texte: Ctrl-C pour copier, Ctrl-V pour coller, Ctrl-X pour couper. Ctrl-Q permet de quitter.

Pour utiliser l'interface sans internet, télécharger les fichiers suivants: xquery.jar, saxon9.jar, saxon9-xpath.jar, saxon9-dom.jar et xmlfiles.jar. Lancer ensuite la commande:

java -cp saxon9.jar:saxon9-xpath.jar:saxon9-dom.jar:xquery.jar:xmlfiles.jar fr.cnrs.liris.ecoquery.xqueryapp.Main

ou bien la commande (si la première ne marche pas):

/usr/lib/jvm/java-1.5.0-sun/bin/java -cp saxon9.jar:saxon9-xpath.jar:saxon9-dom.jar:xquery.jar:xmlfiles.jar fr.cnrs.liris.ecoquery.xqueryapp.Main

Il peut être nécessaire de remplacer les : par des ; sous windows.

En cas de problèmes de connexion à internet lors d'une requête sur un document, supprimer SYSTEM “http:// … .dtd” dans la partie “Données”

Voici quelques liens sur XPath et XQuery:

Évaluation de requêtes XPath

Pour chacune des expressions XPath suivantes, dire à quoi elle correspond et deviner le résultat lorqu'on l'applique sur le documment mentionné. Vérifier ensuite grâce à l'interface.

  1. Document: “Vente livres”, requête: /bib/book/title
  2. Document: “Vente livres”, requête: //price
  3. Document: “Vente livres”, requête: //last
  4. Document: “Vente livres”, requête: //editor/last
  5. Document: “Vente livres”, requête: /bib/book[attribute::year >= 1999]
  6. Document: “Collection”, requête: /collection/tome/dessinateur
    Correction: rien: il n'y a pas d'enfant direct qui soit des éléments tome dans la collection (il n'y a que des series)
  7. Document: “Collection”, requête: //scenariste
  8. Document: “Collection”, requête: /collection//dessinateur[child::text() = "Tarquin"]/..
  9. Document: “Collection”, requête: //tome[numero="1"]/parent::element()
    Correction: rien: dans les tomes, le numéro est spécifié par un attribut et non par un élément (requête correcte: //tome[@numero="1"]/parent::element())
  10. Document: “Hamlet”, requête: /PLAY/TITLE
  11. Document: “Hamlet”, requête: //ACT/TITLE
  12. Document: “Hamlet”, requête: //LINE/TITLE
    Correction: rien: il n'y a pas de titre dans les lignes

Écriture de requêtes XPath

Écrire et tester une requête XPath pour chacune des questions suivantes:

  1. Document: “Database”
    1. L'ensemble des éléments file
      Correction:
      //file
    2. L'élément file ayant pour nom “Hamlet”
      Correction:
      //file[@name="Hamlet"]
    3. L'élément file ayant pour url collection.xml
      Correction:
      //file[@url="collection.xml"]
  2. Document: “Vente livres”
    1. L'ensemble des auteurs
      Correction:
      //author
    2. Les livres ayant pour auteur W.Stevens
      Correction:
      //book[author[last="Stevens" and first="W."]]
    3. Les livres ayant un éditeur
      Correction:
      //book[editor]
    4. Les livres datant d'avant 1999 (inclus) et dont le prix est supérieur à 100. Proposer une solution avec et une solution sans opérateur booléen explicite
      Correction:
      //book[@year <= 1999 and price >= 100]

      et

      //book[@year <= 1999][price >= 100]
    5. Les livres dont un des auteurs a écrit un autre livre vendu ici.
      Correction:
      //book[author = preceding-sibling::book/author or author = following-sibling::book/author]
  3. Document: “Collection” et “Collection 2”
    1. Les séries dont on possède le numero 2.
      Correction:
      //serie[tome/@numero = 2]
    2. Les tomes dont on connaît le scénariste et le dessinateur.
      Correction:
      //tome[dessinateur][scenariste]
    3. L'ensemble des tomes des séries “Lanfeust de Troy” et “Calvin et Hobbes”
      Correction:
      //tome[parent::serie[@nom = "Lanfeust de Troy" or @nom = "Calvin &amp; Hobbes"]]
  4. Document: “Hamlet”
    1. L'ensemble des lignes dites par Hamlet
      Correction:
      //SPEECH[SPEAKER="HAMLET"]/LINE
    2. Les titres des scenes dans lesquelles Horatio répond à Hamlet
      Correction:
      //SCENE[//SPEAKER[../preceding-sibling::SPEECH[1]/SPEAKER = "HAMLET"][child::text() = "HORATIO"]]/TITLE

      ou

      //SCENE//SPEAKER[../preceding-sibling::SPEECH[1]/SPEAKER = "HAMLET"][child::text() = "HORATIO"]/../../TITLE

      ou

      //SPEECH[SPEAKER="HORATIO" and preceding-sibling::SPEECH[1]/SPEAKER = "HAMLET"]/../TITLE