BASE DE DONNÉES XML NATIVE NXDB - eXist - XQuery IvMad, 2011-2012 1. eXist eXist-db Open Source Native XML Database Ce cours s’inspire, reprend, modifie et enrichi des supports disponibles sur Internet 2 NXDB - eXist - XQuery IvMad, 2011-2012 3 Introduction • Le SGBD-XML eXist est un système open-source sous licence GNU. • eXist est utilisable sur toutes les plates-formes: • Linux, Mac OS ou Windows • eXist exploite de nombreux standard tels que: • XQuery, XSLT, XPath, XUpdate, etc. • eXist est facile à installer. • eXist supporte l'accès concurrent. • eXist optimise l'accès aux données par une indexation automatique des données. • eXist propose une documentation riche à l'adresse suivante: http://www.exist-db.org/exist/documentation.xml • eXist se déploie comme une application Web sous le contrôle d'un moteur de Servlet: Tomcat, Jetty ou autre. NXDB - eXist - XQuery La connexion eXist IvMad, 2011-2012 4 NXDB - eXist - XQuery IvMad, 2011-2012 5 Service Java pour eXist eXist peut être interrogée par une application Java en utilisant la méthode d'accès XML-RPC ou un Web service basé SOAP. NXDB - eXist - XQuery IvMad, 2011-2012 6 Méthodologie d'un TP avec eXist • eXist sera utilisé pour mettre en place un site Web avec une base de données XML native afin de pouvoir l'administré en: • intégrant des documents XML, • interrogeant la base données (Xquery), • modifiant la base de données (XQuery Update), • appliquant des feuilles de style aux documents produits (XSLT) • eXist propose une implémentation de XQuery, accompagnée de nombreuses fonctionnalités et d'interfaces Web. • eXist est entièrement développé en Java, il est possible d'utiliser ses librairies dans des programmes Java pour manipuler la BD. • Pour simplifier l'installation du produit une archive intégrant les composants nécessaires au TP est mise en disposition pour être déployé dans un espace utilisateur. NXDB - eXist - XQuery IvMad, 2011-2012 7 Déploiement de eXist • Dans un premier temps il faut déployer l'archive Tomcat.rar avec le moteur de Servlets Tomcat et la BD eXist en tant qu'application Web. • L'archive est à décompresser sur un disque dur ou une clé USB dans le répertoire racine, exemple: c:\tomcat ou e:\tomcat • Le fichier script catalina_start.bat lance le serveur d'application tomcat avec activation du SGBD eXist. • Le fichier script catalina_stop.bat arrête les serveurs. NXDB - eXist - XQuery IvMad, 2011-2012 Le démarrage catalina_start.bat 8 NXDB - eXist - XQuery IvMad, 2011-2012 9 Le serveur Tomcat sur port 8080 NXDB - eXist - XQuery IvMad, 2011-2012 10 Déploiement de eXist • eXist est déployé comme une application Web par le moteur de Servlets Tomcat à son lancement: NXDB - eXist - XQuery IvMad, 2011-2012 11 Le serveur SGBD eXist NXDB - eXist - XQuery IvMad, 2011-2012 Connexion aux collections 12 NXDB - eXist - XQuery IvMad, 2011-2012 13 IvMad, 2011-2012 14 Fonctions de gestion NXDB - eXist - XQuery Collections XML NXDB - eXist - XQuery IvMad, 2011-2012 15 Manipulation d'une collections XML NXDB - eXist - XQuery IvMad, 2011-2012 Créer une collection XML 16 NXDB - eXist - XQuery IvMad, 2011-2012 17 Une bibliothèque en XML <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="bibliotheque.xsl"?> <bibliotheque> <livre><titre>1984</titre> <auteur><nom>Orwell</nom><prenom>George</prenom></auteur> <ref>Fiction-O-1</ref></livre> <livre><titre>N ou M</titre> <auteur> <nom>Christie</nom> <prenom>Agatha</prenom> </auteur> <ref>Policier-C-15</ref></livre> <livre> <titre>Le cheval pale</titre> <auteur> <nom>Christie</nom> <prenom>Agatha</prenom> </auteur> <ref>Policier-C-17</ref> </livre> <livre> <titre>Le chien des Baskerville</titre> <auteur> <nom>Conan Doyle</nom> <prenom>Arthur</prenom> </auteur> <ref>Policier-D-3</ref> </livre> <livre><titre>Dune</titre><auteur><nom>Herbert</nom> <prenom>Franck</prenom> </auteur> <ref>Fiction-H-1</ref> </livre> </bibliotheque> NXDB - eXist - XQuery IvMad, 2011-2012 Activer le client en JavaWebStart 18 NXDB - eXist - XQuery IvMad, 2011-2012 19 Lancer le fichier exist.jnlp NXDB - eXist - XQuery IvMad, 2011-2012 Autoriser l'exécution du fichier 20 NXDB - eXist - XQuery IvMad, 2011-2012 21 Connexion à la BD • S'identifier en tant que admin avec mot de passe guest NXDB - eXist - XQuery IvMad, 2011-2012 22 Choisir une collection dans la BD Interface de requête XQuery NXDB - eXist - XQuery IvMad, 2011-2012 23 Lister une collection de la BD NXDB - eXist - XQuery IvMad, 2011-2012 Activer l'interface XQuery Ouvrir une collection 24 NXDB - eXist - XQuery IvMad, 2011-2012 25 Lancer une requête XQuery Lancer la requête Écrire la requête XQuery: afficher les noms des auteurs présents dans la bib Résultat de la requête NXDB - eXist - XQuery IvMad, 2011-2012 TP - http://localhost:8080/site 26 NXDB - eXist - XQuery IvMad, 2011-2012 27 XQuery en bref • XQuery est un langage de requête pour faire des recherches dans des • • • • • données XML. C'est un langage pour la recherche et l'extraction des elements et d'attributs d'un document XML. XQuery est la même chose pour XML que l'est SQL pour les bases de données relationnelles. XQuery est basé essentiellement sur des expressions XPath XQuery existe chez la plupart des BD XML XQuery est une recommandation W3C La figure montre l'intersection et l'implication des différentes technologies XML NXDB - eXist - XQuery IvMad, 2011-2012 XQuery en bref • XQuery : • Langage pour interroger les données XML (arbres, DOM) • Requêtes pour interroger et extraire des éléments de l'arbre. • Moins que pour transformer l'arbre, plus souple que XSL qui est plus une transformation d’arbre XML, mais utilisant tous les deux les expressions XPath • Semblable à SQL pour les B.D., sauf que SQL : • travaille sur des bases relationnelles : • données fortement en relation dans des tables • base ses requêtes sur la recherche de ces relations fortes Tables Arbre 28 NXDB - eXist - XQuery IvMad, 2011-2012 29 XQuery en bref • Les données XML sont différentes: • Les données relationnelles (SQL) sont denses • Chaque rangée a une valeur dans chaque colonne • Problème des valeurs nulles • Ce n’est pas le cas de XML qui peut avoir : • des éléments vides • des éléments absents • C’est un degré de liberté supérieur pour XML • Les documents XML porte pour cette raison la nomination : • données semi-structurées NXDB - eXist - XQuery IvMad, 2011-2012 XQuery et XPath • Xpath • XPath permet d'exprimer des requêtes de filtrage sur des arbres • Il n'est pas possible : • de créer des nœuds dans l'arbre • de construire des arbres/des documents nouveaux • de trier des nœuds, ... • Il est difficile d'exprimer des jointures (pas de variables) • XQuery • XQuery est un langage de requêtes complet qui permet : • de créer des nœuds et de construire des arbres nouveaux • de définir et d'instancier des variables • de définir des fonctions, ... 30 NXDB - eXist - XQuery IvMad, 2011-2012 31 Format d’une requête XQuery • Une requête XQuery est une composition d’expressions • Chaque expression a une valeur ou retourne une erreur • Forme 1 : Expressions simples : • Valeurs atomiques : • 46, ‘‘Salut’’ • Valeurs construites : • true() • Forme 2 : Expressions complexes : • Expressions de chemins (XPath) • FILM//ACTEUR • Expressions FLWR • For-Let-Where-Return • Tests • if-then-return-else-return NXDB - eXist - XQuery IvMad, 2011-2012 32 Format d’une requête XQuery <biblio> <book category="COOKING"> <title lang="en">Everyday Italian </title> <author>Giada De Laurentiis </author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter </title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </biblio> Expressions régulières Liste de tous les auteurs doc("data/books.xml")//book/author Auteur du premier livre doc("data/books.xml")//book[1]/author Liste de tous les auteurs et prix doc("data/books.xml")// book/(author, price) ou doc("data/books.xml")/(descendant::aut hor,descendant::price) Accès via un attribut Liste des prix des livres qui ont un attribut 'title' doc("data/books.xml")//book/(@title union price) NXDB - eXist - XQuery IvMad, 2011-2012 33 Une collection XML <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore> NXDB - eXist - XQuery IvMad, 2011-2012 Sélectionner un nœud XML • Quelles fonctions pour sélectionner un nœud du fichier XML "books.xml"? • XQuery se sert de fonctions pour l'extraction de parties d'un document XML • La fonction "doc()" ouvre un fichier XML: • doc("books.xml") • Les expressions: • XQuery utilise les expressions Xpath pour naviguer dans un document XML. • L'expression suivante est utilisée pour sélectionner les éléments du titre dans le document "books.xml" • doc("books.xml")/bookstore/book/title • /bookstore sélectionne les éléments bookstore • /book sélectionne tous les éléments book qui se trouvent sous l'élément bookstore • /title sélectionne tous les éléments dans chaque éléments book 34 NXDB - eXist - XQuery IvMad, 2011-2012 35 Lancer la requête XQuery Le bouton qui soumet la requête XQuery Rédiger la requête XQuery Le résultat de la requête XQuery NXDB - eXist - XQuery IvMad, 2011-2012 Filtrer la requête XQuery • XQuery utilise des prédicats afin de limiter (filtrer) la sélection dans un document XML : • Sélectionner tous les éléments book dans bookstore dont le prix est inférieur à 30 en se limitant juste à l'affichage du titre doc("books.xml") /bookstore /book[price<30] /title 36 NXDB - eXist - XQuery IvMad, 2011-2012 37 Filtrer la requête XQuery • Le langage de requête XQuery défini FLWOR ('flower') comme une expression qui prend en charge l'itération et la liaison des variables aux résultats intermédiaires. FLWOR est l'acronyme de: FOR, LET, WHERE, ORDER BY, RETURN. • L'expression FLWOR qui suit produira le même résultat que celle présentée au transparent précèdent. for $x in doc("books.xml")/bookstore/book where $x/price>30 return $x/title NXDB - eXist - XQuery IvMad, 2011-2012 38 Filtrer la requête XQuery • Avec le format FLWOR il est possible d'avoir un résultat trié: for $x in doc("books.xml")/bookstore/book where $x/price>30 order by $x/title return $x/title • La requête utilise l'opérateur for pour sélectionner tous les book contenu dans bookstore dans une variable nommé $x. • La clause where selecte les éléments de book dont l'élément price contient une valeur supérieur à 30. • La clause order by clause définie l'ordre de sortie de l'élément title. • La clause return spécifie le contenu du retour, c.à.d. le résultat. NXDB - eXist - XQuery IvMad, 2011-2012 39 Filtrer la requête XQuery • L'opérateur alternative "if-then-else": for $x in doc("books.xml")/bookstore/book return if ($x/@category="CHILDREN") then <child>{data($x/title)}</child> else <adult>{data($x/title)}</adult> Dans /bookstore/book on cherche à détacher /category contenant l'étiquette "children" pour retourner le résultat balisé en <child>, sinon balisé en <adult> NXDB - eXist - XQuery IvMad, 2011-2012 eXist avec Java XML:DB • On utilise L'API XML:DB dont la description est disponible à l'adresse: http://exist-db.org/api/ • XML:DB API permet: • Gestion de la base et des collections • Stockage et récupération des ressources • Requêtes sur toute ou une partie de l’arborescence • Il existe des extensions qui permettent entre autre : • La gestion des utilisateurs • La gestion de plusieurs bases de données en parallèle, avec chacune une configuration propre • Pour plus d’informations: http://exist-db.org/exist/devguide_xmldb.xml 40 NXDB - eXist - XQuery IvMad, 2011-2012 41 eXist et XML:DB avec Eclipse • Créer un nouveau projet Java sous Eclipse NXDB - eXist - XQuery IvMad, 2011-2012 eXist et XML:DB avec Eclipse Donner un nom au projet et passer à la page suivante 42 NXDB - eXist - XQuery IvMad, 2011-2012 43 eXist et XML:DB avec Eclipse Ajouter les jar qui font le lien avec l'API XML:DB de eXist et sont nécessaires à la compilation et à l'exécution de l'application NXDB - eXist - XQuery IvMad, 2011-2012 eXist et XML:DB avec Eclipse Sélectionner les jar et les ajouter par le bouton "Add external JARs" 44 NXDB - eXist - XQuery IvMad, 2011-2012 45 Créer une classe dans le projet import org.xmldb.api.base.*; import org.xmldb.api.modules.*; import org.xmldb.api.*; import javax.xml.transform.OutputKeys; import org.exist.xmldb.EXistResource; public class Retrieve { // connexion à la BD et afficher une collection private static String URI = "xmldb:exist://139.124.38.134:8080/exist/xmlrpc"; public static void main(String args[]) throws Exception { final String driver = "org.exist.xmldb.DatabaseImpl"; Class cl = Class.forName(driver); // initialize database driver Database database = (Database) cl.newInstance(); database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); Collection col = null; XMLResource res = null; try { // get the collection col = DatabaseManager.getCollection(URI + "/db/biblio"); col.setProperty(OutputKeys.INDENT, "no"); res = (XMLResource)col.getResource("bib.xml"); if(res == null) { System.out.println("document not found!"); } else { System.out.println(res.getContent()); } } finally { //dont forget to clean up! if(res != null) { try { ((EXistResource)res).freeResources(); } catch(XMLDBException xe) {xe.printStackTrace();} } if(col != null) { try { col.close(); } catch(XMLDBException xe) {xe.printStackTrace();} } } }} NXDB - eXist - XQuery IvMad, 2011-2012 eXist et XML:DB avec Eclipse 46 NXDB - eXist - XQuery IvMad, 2011-2012 47 Accès à une collection de la BD • Pour accéder à une collection, il faut se connecter au driver de la base de données eXist: org.exist.xmldb.DatabaseImpl • Il est enregistré dans le programme avec le DatabaseManager • Pour extraire une collection à partir de la base de données eXist on fait appel à la méthode statique DatabaseManager.getCollection ( ) • L'identification d'une collection se fait par son URI complet dont le format est : • xmldb : [DATABASE-ID] :// [HOST-ADDRESS] /db/ collection • où DATABASE-ID est "eXist", • et "HOST-ADDRESS" est localhost: 8080 si nous sommes en local et si le port utilisé est 8080 • Si on utilise une machine distante il faut préciser son adresse IP. NXDB - eXist - XQuery IvMad, 2011-2012 48 Requête XQuery avec Java • Pour interroger la BD on peut utiliser deux services: • XPathQueryService • XQueryService • L'API XML:DB de eXist défini différents types de services: • La méthode getService de la classe Collection fait appel au service approprié • Pour l'exécution d'une requête la méthode service.query(xpath) est appelée. Elle retourne un objet de type ResourceSet qui contient les ressources trouvés par la requête. • ResourceSet.getIterator() est le conteneur des ressources. • Chaque ressource contient un fragment de document ou une valeur sélectionner par l'expression Xpath ou XQuery. NXDB - eXist - XQuery IvMad, 2011-2012 49 Requête XQuery avec Java import org.xmldb.api.base.*;import org.xmldb.api.modules.*; import org.xmldb.api.*;import org.exist.xmldb.EXistResource; public class QueryExample { private static String URI = "xmldb:exist://139.124.38.134:8080/exist/xmlrpc"; public static void main(String args[]) throws Exception { final String driver = "org.exist.xmldb.DatabaseImpl"; Class cl = Class.forName(driver); // initialize database driver Database database = (Database) cl.newInstance(); database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); Collection col = null; try { col = DatabaseManager.getCollection(URI + "books"); XQueryService xqs = (XQueryService) col.getService("XQueryService", "1.0"); xqs.setProperty("indent", "yes"); CompiledExpression compiled = xqs.compile("/bookstore/book/author"); ResourceSet result = xqs.execute(compiled); ResourceIterator i = result.getIterator(); Resource res = null; while(i.hasMoreResources()) { try { res = i.nextResource(); System.out.println(res.getContent()); } finally { //A la fin faut libérer les ressources try { ((EXistResource)res).freeResources(); } catch(XMLDBException xe) {xe.printStackTrace();} } }} finally { if(col != null) {try { col.close(); } catch(XMLDBException xe) {xe.printStackTrace();}}} } } NXDB - eXist - XQuery IvMad, 2011-2012 50 Requête XQuery avec Java • Connexion à la BD: String URI = "xmldb:exist://localhost:8080/exist/xmlrpc" final String driver = "org.exist.xmldb.DatabaseImpl"; Class cl = Class.forName(driver); Database database = (Database) cl.newInstance(); database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); Le pilote XML:DB • Constitution et envoi de la requête XQuery: col=DatabaseManager.getCollection(URI + "books"); XQueryService xqs=(XQueryService) col.getService("XQueryService","1.0"); xqs.setProperty("indent", "yes"); CompiledExpression compiled = xqs.compile("/bookstore/book/author"); • Récupération du résultat: ResourceSet result = xqs.execute(compiled); ResourceIterator i = result.getIterator(); La collection à interroger Adresse de la collection Le requête XQuery NXDB - eXist - XQuery IvMad, 2011-2012 51 Requête XQuery avec Eclipse NXDB - eXist - XQuery IvMad, 2011-2012 52 Exercices de requêtes avec Java • Affichez tous les titres de films • Afficher le titre du film avec un auteur choisi • Afficher le titre du livre de la collection 'biblio' dont le nom de l'auteur est 'Scholl' • Afficher les titres des films ordonnés par genre • Afficher la collection 'films' • Afficher la collection 'biblio' • Afficher le titre des films avec 'Kate Winslet' et 'Leonardo DiCaprio' • Composer la requête XQuery qui répond à la question: Quel rôle joue 'Kate Winslet' dans le film 'Titanic'. • Afficher le 'Résumé' du film avec 'John Travolta' Remarque: Effectuez les requêtes XQuery par l'interface XQuery de eXist et par un programme Java NXDB - eXist - XQuery IvMad, 2011-2012 Accès aux supports du cours • Les transparents du cours sont accessibles à l'adresse: http://ivmad.free.fr/ic4/Cours-IvMad-eXist-M1-2012.pdf ou http://valk.iut-gtr.univ-mrs.fr/ic4/Cours-IvMad-eXist-M1-2012.pdf • Le support de TP: Tomcat-eXist-Exercices est accessible à l'adresse: http://ivmad.free.fr/ic4/tomcat-exist.rar ou http://valk.iut-gtr.univ-mrs.fr/ic4/tomcat-exist.rar • Adresse de contact: [email protected] 53