Java – eXist. Un Par Inseparable

Posted: marzo 8th, 2009 under eXist, XML, XQuery.

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:
  • import org.xmldb.api.base.*;
    import org.xmldb.api.modules.*;
    import org.xmldb.api.*;

  • Conocer el driver a utilizar: «org.exist.xmldb.DatabaseImpl» ó «org.apache.xindice.client.xmldb.DatabaseImpl»
  • Conocer la URL de la base de datos eXist.

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.

4 Comments »

  • Comment por Joseba — 17 diciembre 2009 @ 18:46

    1

    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

    2

    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

    3

    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

    4

    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.


RSS feed for comments on this post. TrackBack URL

Leave a comment