13
http://www.programacion.com/bbdd/articulo/xmlapisdata/ APIs XML para Bases de Datos Autor: Sun Para procesar documentos XML, la mayoría de las herramientas XML trabajan con los APIs SAX o DOM. En este artículo, veremos una forma de implementar los mismo APIs directamente sobre una base de datos, permitiendo a las herramientas de XML tratar con bases de datos como si fueran documentos XML. De esta forma, podemos obviar la necesidad de convertir una base de datos. Veremos una implementación del API SAX para Bases de Datos que debería funcionar con cualquier base de datos con un driver JDBC. Luevo examinaremos una implementación del API DOM para Bases de Datos que usa el API SAX internamente. Para demostrar el API SAX para Bases de Datos, veremos su integración con XT (un procesador XSLT). También veremos un ejemplo de como dicha integración puede crear páginas HTML que incorporan hojas de estilo XSLT directamente desde la base de datos. Finalmente, veremos como el API DOM para bases de datos se integra con un procesador XQL. En este artículo, haremos uso de las herramientas existentes en vez de crear nuevas herramientas para ilustrar las aplicaciones de los APIs SAX y DOM para bases de datos. Hemos visto como ha crecido el número de herramientas XML disponibles para trabajar con bases de datos. Todas las herramientas XML que mencionamos aquí o son gratuitas o lo són para un uso no-comercial (aunque deberías, por supuesto, comprobar los acuerdos de licencia). Introducción a los APIs SAX y DOM SAX es un API para XML basado en eventos. Con él, el analizador SAX reporta los eventos como el inicio o final de los elementos de la aplicación y mientras pasa a través del documento. Como el analizador reporta los eventos mientras visita las diferentes partes del documento, no tiene que construir una estructura interna. Esto reduce los recursos de sistema necesarios, lo que hace a este analizador atractivo para grandes documentos. Para documentos XML recibidos como streams continuos, un API basado en eventos es la única elección. Por otro lado, el API DOM, sigue una construcción estilo árbol. Los elementos tienen relaciones padre-hijo con otros elementos. Con este API, el analizador construye una estrucura interna por la que una aplicación puede navegar. DOM permite que una aplicación tenga acceso aleatorio al documento estructurado como un árbol, y el coste es el incremento de la memoria utilizada.

APIS XML Para Bases de Datos

Embed Size (px)

DESCRIPTION

bbbb

Citation preview

http://www

http://www.programacion.com/bbdd/articulo/xmlapisdata/APIs XML para Bases de Datos

Autor: SunPara procesar documentos XML, la mayora de las herramientas XML trabajan con los APIs SAX o DOM. En este artculo, veremos una forma de implementar los mismo APIs directamente sobre una base de datos, permitiendo a las herramientas de XML tratar con bases de datos como si fueran documentos XML. De esta forma, podemos obviar la necesidad de convertir una base de datos.

Veremos una implementacin del API SAX para Bases de Datos que debera funcionar con cualquier base de datos con un driver JDBC. Luevo examinaremos una implementacin del API DOM para Bases de Datos que usa el API SAX internamente. Para demostrar el API SAX para Bases de Datos, veremos su integracin con XT (un procesador XSLT). Tambin veremos un ejemplo de como dicha integracin puede crear pginas HTML que incorporan hojas de estilo XSLT directamente desde la base de datos. Finalmente, veremos como el API DOM para bases de datos se integra con un procesador XQL.

En este artculo, haremos uso de las herramientas existentes en vez de crear nuevas herramientas para ilustrar las aplicaciones de los APIs SAX y DOM para bases de datos. Hemos visto como ha crecido el nmero de herramientas XML disponibles para trabajar con bases de datos. Todas las herramientas XML que mencionamos aqu o son gratuitas o lo sn para un uso no-comercial (aunque deberas, por supuesto, comprobar los acuerdos de licencia).

Introduccin a los APIs SAX y DOM

SAX es un API para XML basado en eventos. Con l, el analizador SAX reporta los eventos como el inicio o final de los elementos de la aplicacin y mientras pasa a travs del documento. Como el analizador reporta los eventos mientras visita las diferentes partes del documento, no tiene que construir una estructura interna. Esto reduce los recursos de sistema necesarios, lo que hace a este analizador atractivo para grandes documentos. Para documentos XML recibidos como streams continuos, un API basado en eventos es la nica eleccin.

Por otro lado, el API DOM, sigue una construccin estilo rbol. Los elementos tienen relaciones padre-hijo con otros elementos. Con este API, el analizador construye una estrucura interna por la que una aplicacin puede navegar. DOM permite que una aplicacin tenga acceso aleatorio al documento estructurado como un rbol, y el coste es el incremento de la memoria utilizada.

APIs de XML para Bases de Datos: Lo Bsico

A causa de la estructura altamente regular del almacenamiento de datos en una base de datos, podemos mapearla dentro de documentos XML centrados en datos. Por ejemplo, podemos transformar una tabla de una base de datos en un documento XML con un DTD de la siguiente forma:

....

En otras palabras, con un API XML para base de datos, podemos hacer que la base de datos se parezca a un documento XML; estos APIs presentan la base de datos como un documento XML virtual. Tenemos los conceptos ms bsico del diseo orientado a objetos: es el interface -- no la implementacin -- lo que importa. En nuestra situacin, las herramientas que usan dichos APIS XML no necesitan tener cuidado de si estn operando con una tabla de una base de datos o con un fichero XML.

Un analizador SAX o DOM puede permitir a las herramientas XML trabajar directamente con bases de datos.

Implementar el API SAX para Bases de Datos

Para implementar el API SAX para Bases de Datos, necesitamos implementar un analizador que opere sobre una fuente de datos JDBC, iterar sobre cada fila y columna, y generar los eventos apropiados mientras iteramos. La especificacin SAX proporciona la clase org.xml.sax.InputSource que modela la fuente de datos representando una URL o un stream de bytes. Para representar una base de datos, necesitamos una forma especializada que pueda representar una tabla de una base de datos. Por lo tanto implementamos JDBCInputSource, que extiende la clase org.xml.sax.InputSource . Echemos un vistazo en ms detalle a la clase JDBCInputSource.java:

package dbxml.sax;

import java.sql.*;

import org.xml.sax.InputSource;

public class JDBCInputSource extends InputSource {

private String _connectionURL;

private String _userName;

private String _passwd;

private String _tableName;

public JDBCInputSource(String connectionURL, String userName,

String passwd, String tableName) {

super(connectionURL);

_connectionURL = connectionURL;

_userName = userName;

_passwd = passwd;

_tableName = tableName;

}

public String getTableName() {

return _tableName;

}

public Connection getConnection() throws SQLException {

return DriverManager.getConnection(_connectionURL,

_userName, _passwd);

}

}

En el cdigo de arriba, el constructor toma la informacin necesaria para conectar con la base de datos y el nombre de la tabla a analizar. El mtodo getConnection() conecta con la base de datos y devuelve un objeto Connection.

Luego, necesitamos implementar el analizador SAX que usa JDBCInputSource para iterar sobre las filas y columnas de la tabla de la base de datos y generar eventos SAX. Para simplificar el cdigo, hemos creado una clase abstracta ParserBase, que implementa org.xml.sax.Parser y tiene responsabilidad slo para manejar varios controladores. Despus creamos nuestro analizador SAX para la fuente JDBC JDBCSAXParser que extiende la clase ParserBase.

(Aqu puedes ver el cdigo de ParserBase.java.)

JDBCSAXParser.java

package dbxml.sax;

import java.io.IOException;

import java.sql.*;

import org.xml.sax.*;

import org.xml.sax.helpers.AttributeListImpl;

public class JDBCSAXParser extends ParserBase {

private static final

AttributeList _stockEmptyAttributeList = new AttributeListImpl();

//-------------------------------------

//Methods from the Parserinterface

//-------------------------------------

public void parse (InputSource source) throws SAXException, IOException {

if (! (source instanceof JDBCInputSource)) {

throw new SAXException("JDBCSAXParser can work only with source "

+ "of JDBCInputSource type");

}

parse((JDBCInputSource)source);

}

public void parse (String systemId) throws SAXException, IOException {

throw new SAXException("JDBCSAXParser needs more information to "

+ "connect to database");

}

//-------------------------

// Additional methods

//--------------------------

public void parse(JDBCInputSource source) throws SAXException, IOException {

try {

Connection connection = source.getConnection();

if (connection == null) {

throw new SAXException("Could not establish connection with "

+ "database");

}

String sqlQuery = getSelectorSQLStatement(source.getTableName());

PreparedStatement pstmt = connection.prepareStatement(sqlQuery);

ResultSet rs = pstmt.executeQuery();

parse(rs, source.getTableName());

rs.close();

connection.close();

}

catch (SQLException ex) {

throw new SAXException(ex);

}

}

public void parse(ResultSet rs, String tableName)

throws SAXException, SQLException, IOException {

if (_documentHandler == null) {

return; // nobody is interested in me, no need to sweat!

}

ResultSetMetaData rsmd = rs.getMetaData();

int numCols = rsmd.getColumnCount();

String tableMarker = getTableMarker(tableName);

String rowMarker = getRowMarker();

_documentHandler.startDocument();

_documentHandler.startElement(tableMarker,_stockEmptyAttributeList);

while(rs.next()) {

_documentHandler.startElement(rowMarker, _stockEmptyAttributeList);

for (int i = 1; i