====== TP BDAV - XPath ====== ===== Préliminaires ===== [[http://liris.cnrs.fr/~ecoquery/files/xquery.jnlp|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 [[http://saxon.sourceforge.net/|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 [[http://www.w3.org/TR/xslt|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: [[http://liris.cnrs.fr/~ecoquery/files/xquery.jar|xquery.jar]], [[http://liris.cnrs.fr/~ecoquery/files/saxon9.jar|saxon9.jar]], [[http://liris.cnrs.fr/~ecoquery/files/saxon9-xpath.jar|saxon9-xpath.jar]], [[http://liris.cnrs.fr/~ecoquery/files/saxon9-dom.jar|saxon9-dom.jar]] et [[http://liris.cnrs.fr/~ecoquery/files/xmlfiles.jar|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: * Tout d'abord, un [[:enseignement:bdav:xquery|petit résumé]]. * La [[http://www.w3.org/TR/xpath20/|définition de XPath]] par le W3C. * La [[http://www.w3.org/TR/xquery/|définition de XQuery]] par le W3C. * Les [[http://www.w3.org/TR/xpath-functions/|fonctions standard de XQuery/XPath]]. ===== É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. - Document: "Vente livres", requête: ''/bib/book/title'' - Document: "Vente livres", requête: ''//price'' - Document: "Vente livres", requête: ''//last'' - Document: "Vente livres", requête: ''//editor/last'' - Document: "Vente livres", requête: ''/bib/book[attribute::year >= 1999]'' - 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'')// - Document: "Collection", requête: ''//scenariste'' - Document: "Collection", requête: ''/collection//dessinateur[child::text() = "Tarquin"]/..'' - 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()'')// - Document: "Hamlet", requête: ''/PLAY/TITLE'' - Document: "Hamlet", requête: ''//ACT/TITLE'' - 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: - Document: "Database" - L'ensemble des éléments file\\ **Correction:**//file - L'élément file ayant pour nom "Hamlet"\\ **Correction:**//file[@name="Hamlet"] - L'élément file ayant pour url ''collection.xml''\\ **Correction:**//file[@url="collection.xml"] - Document: "Vente livres" - L'ensemble des auteurs\\ **Correction:**//author - Les livres ayant pour auteur W.Stevens\\ **Correction:**//book[author[last="Stevens" and first="W."]] - Les livres ayant un éditeur\\ **Correction:**//book[editor] - 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] - 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] - Document: "Collection" et "Collection 2" - Les séries dont on possède le numero 2.\\ **Correction:**//serie[tome/@numero = 2] - Les tomes dont on connaît le scénariste et le dessinateur.\\ **Correction:**//tome[dessinateur][scenariste] - 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 & Hobbes"]] - Document: "Hamlet" - L'ensemble des lignes dites par Hamlet\\ **Correction:**//SPEECH[SPEAKER="HAMLET"]/LINE - 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