Esta API proporciona una interfaz común para bases de datos nativas o habilitadas para XML y admite el desarrollo de aplicaciones portátiles y reutilizables.
Los componentes básicos empleados por XML: DB API son controladores , colecciones , recursos y servicios .
- Los controladores son implementaciones de la interfaz de la base de datos que encapsulan la lógica de acceso a la base de datos para productos de bases de datos XML específicos. Son proporcionados por el proveedor del producto y deben registrarse con el gestor de la base de datos.
- Una colección es un contenedor jerárquico de recursos y otras subcolecciones. Actualmente, la API define dos recursos diferentes: XMLResource y BinaryResource. An XMLResource representa un documento XML o un fragmento de documento, seleccionado por una consulta XPath ejecutada previamente.
- Finalmente, se solicitan servicios para tareas especiales, como consultar una colección con XPath o administrar una colección.
La API XML:DB 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
.
Hay varios ejemplos de XML: DB proporcionados en la pagina de eXist .
En el siguiente ejemplo sencillo , se recupera un documento del servidor eXist y se imprime en la salida estándar. El programa recibe dos argumentos arg[0]
y arg[1]
, nombre de la colección y nombre del fichero xml, respectivamente.
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 RetrieveExample {
private static String URI = "xmldb:exist://localhost:8080/exist/xmlrpc";
/**
* args[0] Should be the name of the collection to access
* args[1] Should be the name of the resource to read from the collection
*/
public static void main(String args[]) throws Exception {
final String driver = "org.exist.xmldb.DatabaseImpl";
// initialize database driver
Class cl = Class.forName(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 + args[0]);
col.setProperty(OutputKeys.INDENT, "no");
res = (XMLResource)col.getResource(args[1]);
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();}
}
}
}
}
En este ejemplo se registra el driver para eXist.// initialize database driver
Class cl = Class.forName("org.exist.xmldb.DatabaseImpl");
Database database = (Database) cl.newInstance();
database.setProperty("create-database", "true");
DatabaseManager.registerDatabase(database);
Collection
) del gestor de la base de datos:col = DatabaseManager.getCollection(URI + args[0]);
Una vez utilizado el recurso se debe cerrar:
col.close()
El método getCollection()
espera una URI con el formato siguiente:
xmldb:[DATABASE-ID]://[HOST-ADDRESS]/db/collection
Debido a que se puede registrar más de un controlador de base de datos , se requiere la primera parte del URI (xmldb:exist
) para determinar qué clase de controlador se debe usar. El objeto de DatabaseManager
utiliza la identificación de la base de datos para seleccionar el controlador correcto de su lista de controladores disponibles.
La parte final del URI identifica la ruta a la colección y, opcionalmente, la dirección de host del servidor de base de datos en la red. Internamente, eXist usa dos implementaciones de controladores diferentes: la primera habla con un motor de base de datos remoto que usa llamadas XML-RPC, la segunda tiene acceso directo a una instancia local de eXist-db.
La colección raíz siempre se identifica con / db.
Por ejemplo:
xmldb:exist://localhost:8080/exist/xmlrpc/db/shakespeare/plays
Si omitimos la dirección de host el driver XML:DB tratará de conectarse a una instancia local de la base de datos. Por ejemplo:
xmldb:exist:///db/shakespeare/plays
En este caso, debemos decirle al driver que creea una instancia a la base de datos si no hay ninguna creada. Esto se hace poniendo la propiedad create-database
de la clase Database
a true.
Para mas informacion del uso embebido de eXist-db consulta deployment guide.
El metodo setProperty
se utiliza para establecer parámetros específicos de la base de datos.
La llamada col.getResource()
recupera el documento, que se devuelve como un archivo XMLResource
. Todos los recursos tienen un método getContent()
, que devuelve el contenido del recurso, dependiendo de su tipo. En este caso recuperamos el contenido como tipo String
.