Hasta ahora sólo me he preocupado de enseñaros como utilizar las herramientas que proporciona eXist. Pero, ¿Cómo podemos interactuar desde nuestra aplicación Java con eXist?. Esta pregunta espero responderla en este post.
Antes de nada gracias a Victor Cima y a Carlos pues en su día sus páginas fueron mis referentes.
Afortunadamente para poder realizar esta labor, el grupo XMLDB ha propuesto un API que todos los proveedores deben implementar. Al igual que con otras aplicaciones la API simplemente define un conjunto de interfaces que cada proveedor implementa. La API propuesta principalmente se basa en tres paquetes:
- org.xmldb.api: Interfaces, DatabaseManager
- org.xmldb.api.base: Interfaces, Collection, Configurable, Database, Resource, ResourceIterator, ResourceSet, Service , Classes, ErrorCodes , Exceptions, XMLDBException
- org.xmldb.api.modules: Interfaces, BinaryResource, CollectionManagementService, TransactionService, XMLResource, XPathQueryService, XUpdateQueryService
Para su uso con eXist únicamente debemos tener presente:
- Incluir las librerías oportunas en el proyecto: exist.jar, exist-optional.jar, xmldb.jar, xml-apis-1.3.04.jar, xmlrpc-common-3.1.1.jar, xmlrpc-common-3.1.1.jar situadas en la instalación de eXist.
- Importar las librerías oportunas:
- Conocer el driver a utilizar: «org.exist.xmldb.DatabaseImpl» ó «org.apache.xindice.client.xmldb.DatabaseImpl»
- Conocer la URL de la base de datos eXist.
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
import org.xmldb.api.*;
En el siguiente ejemplo os muestro el código para lanzar una consulta XQuery sobre eXist desde Java usando la API XMLDB.
import org.xmldb.api.base.*; import org.xmldb.api.modules.*; import org.xmldb.api.*; public class QueryExample { public static void main(String args[]) throws Exception { String driver = "org.exist.xmldb.DatabaseImpl"; //Driver Class cl = Class.forName(driver);//Cargar el driver Database database = (Database) cl.newInstance(); //Instancia de la BD database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); //Registrar la BD //Accedemos a la colección Collection col =DatabaseManager.getCollection("xmldb:exist://localhost:8080/exist/xmlrpc/db/", "USER", "PASSWORD"); XPathQueryService service =(XPathQueryService) col.getService("XPathQueryService", "1.0"); service.setProperty("pretty", "true"); service.setProperty("encoding", "ISO-8859-1"); //Consulta a lanzar ResourceSet result = service.query("for $b in doc('prueba.xml')//a return $b"); ResourceIterator i = result.getIterator(); while (i.hasMoreResources()) { //Procesamos el resultado Resource r = i.nextResource(); System.out.println((String) r.getContent()); } } }
Espero que os sea útil, sucesivamente iré proporcionando otros códigos de utilidad.
Añadido en Enero: Es necesario también las librerías log4j-1.2.15.jar y ws-commons-util-1.0.2.jar.
Comment por Joseba — 17 diciembre 2009 @ 18:46
Hola,
Primero felicitarte por las entradas realizadas en este blog, son realmente muy interesantes.
Acabo de probar la conexión a exist que muestras arriba y a la hora de realizar el «cl.forName(driver)» me da una excepción de tipo InvocationTargetException. He realizado algunas pruebas cambiando la clase a cargar, por ejemplo org.exist.xmldb.CollectionImpl, y resulta que solo me falla con la clase org.exist.xmldb.DatabaseImpl.
No se si habeis tenido algún problema similar, porque realmente estoy un poco perdido.
Gracias de antemano y saludos!
Comment por ljarevalo — 18 diciembre 2009 @ 8:36
Hola Joseba,
Acabo de realizar de nuevo el proyecto completo desde cero y todo ha funcionado perfectamente. Creo que el problema se puede encontrar en el hecho que deben incluirse todos los .jar indicados en el post durante el proceso de compilación y «ejecución» del código fuente. Si usas Netbeans o Eclipse añade las librerías al proyecto y si lo usas en modo consola, añade la opción -classpath «dir» con el directorio donde esten
Comment por maria — 26 enero 2010 @ 11:02
hola!
he copiado tu codigo tal y como esta indicado arriba,y cuando intentamos acceder a la coleccion me salen un par de errores del tipo:
Exception in thread «main» org.xmldb.api.base.XMLDBException:
at org.xmldb.api.DatabaseManager.getDatabase(Unknown Source)
at org.xmldb.api.DatabaseManager.getCollection(Unknown Source)
a que podria deberse??
muchas gracias
Comment por ljarevalo — 1 febrero 2010 @ 19:15
Hola,
Faltan dos librerías que son necesarias: log4j-1.2.15.jar y ws-commons-util-1.0.2.jar.
Por otro lado ten cuidado a la hora de realizar la consulta pues el ejemplo considera que existe un documento «prueba.xml» situado en la raíz de la base de dato.
Cualquier otro problema, no dudes en postear.