APIs de Java para XML

JAXB proporciona un forma r�pida y conveniente de crear un mapeo de dos v�as entre documentos XML y objetos Java. Dando un DTD, el compilador JAXB genera un conjunto de clases Java, que contienen todo el c�digo para analizar documentos XML basados en ese esquema. Un desarrollador usando las clases generadas puede construir un �rbol de objetos Java representando un documento XML, manipular el contenido del �rbol, y regenerar el documento XML desde el �rbol.

Para empezar a usar una aplicaci�n JAXB todo lo que necesitamos es un esquema, que en la versi�n de JAXB actual, debe ser un DTD. Podemos escribir nuestro propio DTD, u obtenerlo desde cualquier otro lugar, como un repositorio de DTDs est�ndars al que se accede a trav�s de JAXR.

Una vez que tenemos nuestro DTD, lo unimos a un conjunto de clases realizando los siguientes pasos:

  1. Escribir un esquema de uni�n, que contiene las instrucciones para unir el esquema a las clases. El esquema de uni�n est� escrito en un lenguaje de uni�n basado en XML, que est� incluido con el JAXB.
  2. Ejecutar el compilador de esquema, que toma un DTD y un esquema de uni�n y genera las clases a partir de ellos. Cada clase que genere el compilador tiene un m�todo get y otro m�todo set. Cuando se crea e inicializa con datos un ejemplar de la clase, podemos usar estos m�todos accesores para acceder a los m�todos. Un conjunto de m�todos accesores se llama una propiedad.

.�Generar Clases desde un DTD

Como ejemplo de generaci�n de clases desde un DTD, consideremos el siguiente DTD, que se llama "priceList.dtd".

<!ELEMENT priceList (coffee)+ >
<!ELEMENT coffee (name, price) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT price (#PCDATA) >

El compilador de esquema JAXB es suficientemente poderoso como para hacer asumciones razonables desde el DTD y el esquema de uni�n que especifica s�lo el elemento ra�z del documento. Todo lo que necesitamos especificar en el esquema de uni�n es que el elemento price es convertido a una propiedad que devuelve y acepta un BigDecimal:

...
<element name="priceList" type="class" class="PriceList" root="true" />
<element name="price" type="value" convert="BigDecimal" />
<conversion name="BigDecimal" type="java.math.BigDecimal" />
...

Desde este DTD y este esquema de uni�n, el compilador de esquema genera una clase PriceList y una clase Coffee.

La clase PriceList incluye un constructor y una lista de propiedades, a las que est� unida el elemento coffee. La clase Coffee contiene un constructor y una propiedad para representar el nombre del caf� y una propiedad para representar el precio. Los m�todos accesores para el precio son:

BigDecimal getPrice();
void setPrice(BigDecimal x);

Las dos clases tambi�n contienen m�todos para desempaquetar, validar y empaquetar. Desempaquetar es el proceso de construir una represenci�n objeto del dato XML. La validaci�n es el proceso de chequear si el objeto est� conforme a las especificaciones del DTD. Empaquetar es el proceso de generar datos XML desde una representaci�n objeto.

.�Construir Representaciones Objeto de Datos XML

Despu�s de generar nuestras clases, podemos escribir aplicaciones Java que las usen para construir representaciones objeto del documento XML que sean v�lidos con respecto al DTD. Cada objeto corresponde a un elemento del documento XML. De forma similar, cada objeto es un ejemplar de una clase del conjunto de clases generadas. Como los objetos se mapean tanto al documento como a las clases, tenemos dos formas diferentes de construir el �rbol de objetos Java: desempaquetando un documento XML v�lido, o ejemplarizando objetos desde las clases. De esta forma, JAXB nos permite procesar documentos XML existentes y crer nuevos datos XML ejemplarizando las clases generadas.

Supongamos que tenemos este documento XML:

<priceList>
    <coffee>
        <name>Arabica</name>
        <price>13.50</price>
    </coffee>
    <coffee>
        <name>Mocha Java</name>
        <price>11.95</price>
    </coffee>
    <coffee>
        <name>Sumatra</name>
        <price>12.50</price>
    </coffee>
</priceList>

Para desempaquetar este documento XML, creamos un stream de entrada desde �l y llamamos al m�todo unmarshal de la clase PriceList:

FileInputStream fis = new FileInputStream("priceList.xml");
PriceList myPrices = PriceList.unmarshal(fis);

Ahora tenemos un �rbol de objetos Java con el objeto myPrices como la ra�z del �rbol.

Supongamos que queremos crear nuestra propia lista de precios de caf�s como un documento XML. Primero cramos el �rbol de objetos por ejemplarizaci�n y luego empaquetamos el �rbol en un documento XML. Para crear un �rbol de objetos usando ejemplarizaci�n, creamos un objeto PriceList, obtenemos la lista de objetos Coffee desde �l, creamos un nuevo objeto Coffee, y lo a�adimos a la lista:

PriceList myNewPrices = new PriceList();
List listOfCoffees = myNewPrices.getCoffees();
Coffee zCoffee = new Coffee();
zCoffee.setName("Zapoteca");
zCoffee.setPrice("15.00");
listOfCoffees.add(zCoffee);

Una vez que tenemos el dato XML en forma de un �rbol de objetos, podemos trabajar con los datos como con cualquier otro objeto Java. De esta forma, JAXB proporciona un interface de programaci�n Java para XML y nos permite la integraci�n de datos XML dentro de apliaciones Java.

.�Acceder a Datos desde el �rbol de Objetos

Supongamos que queremos cambiar el precio de "Mocha Java" en el primer �rbol de objetos que creamos. Todo lo que hacemos es encontrar "Mocha Java" en la lista de caf�s y seleccionar un nuevo precio llmando al m�todo setPrice sobre el objeto Coffee:

List coffees = myPrices.getCoffees();
for (ListIterator i = coffees.listIterator(); i.hasNext(); ) {
    Coffee myCoffee = (Coffee) i.next();
    if (myCoffee.getName().equals("Mocha Java") ) {
        myCoffee.setPrice("12.50");
    }
}

.�Escribir Documentos XML desde el �rbol de Objetos

Siempre que usemos desempaquetamiento o ejemplarizaci�n para construir nuestra representaci�n objeto, podemos empaquetar los objetos en un documento XML, lo que significa que JAXB tambi�n permite crear nuevos documentos XML que son v�lidos con respecto al esquema.

Para empaquetar nuestro �rbol de objetos modificados en un nuevo documento XML, creamos un fichero XML y un stream de salida para llamar al m�todo marshal sobre el objeto myNewPrices:

File newPrices = new File("newPriceList.xml");
FileOutputStream fos = new FileOutputStream(newPrices);
myNewPrices.marshal(fos);

.�Sumario

JAXB esencialmente proporciona un puente entre XML y la tecnolog�a Java. Al igual que un documento XML es un ejemplar de un esquema, un objeto Java es un ejemplar de una clase. As�, JAXB nos permite crear objetos Java al mismo nivel conceptual que los datos XML. Representar nuestros datos de esta forma nos permite manipularlos de la misma forma que manipular�amos objetos Java, haciendo f�cil el crear aplicaciones para procesar datos XML. Una vez que tenemos nuestros datos en forma de objetos Java, es f�cil acceder a ellos. Adem�s, despu�s de trabajar con los datos, podemos escribir los objetos Java en un nuevo, y v�lido documento XML. Con el sencillo acceso a datos XML que proporciona JAXB, somos libres para escribir aplicaciones que realmente usen los datos, en lugar de gastar tiempo en escribir c�digo para analizar y procesar los datos.

.�Diferencias entre JAXP y JAXB

JAXP y JAXB sirven a muy diferentes prop�sitos. La arquitectura o el API que elijamos depende de los requerimientos de nuestra aplicaci�n. Una ventaja de JAXP es que nos permite analizar y procesar los datos desde el mismo conjunto de APIs. Si s�lo queremos grabar unos pocos datos de un gran documento, deber�amos usar un analizador SAX porque analiza los datos como un stream, l o que es muy r�pido. Si tenemos un documento que no es muy largo, y queremos a�adirle o eliminarle datos, deber�amos usar DOM. Aunque un �rbol DOM puede ocupar una gran cantidad de memoria, el API DOM incluye funciones comunes para manipulaci�n de �rboles. Si queremos transformar los datos a otro formato, deber�amos usar JAXP, que incluye el API transformer y una transformaci�n XSLT en la implementaci�n de referencia que nos permite transformar documentos XML, eventos SAX o �rboles DOM. JAXP tambi�n nos pemite la flexibilidad de validar los datos o no.

Si queremos construir una representaci�n objeto de datos XML, pero necesitamos evitar las limitaciones de memoria de DOM, deber�amos usar JAXB. Las clases creadas con JAXB no incluyen capacidades de manipulaci�n de �rboles, que es un factor que contribuye al peque�o uso de memoria de un �rbol de objetos JAXB. Otra ventaja de este tipo de �rboles es que podemos a�adir �rboles adem�s de que los objetos hijos pueden tener m�s de un objeto padre. Adem�s, procesar los datos con JAXB es casi tan r�pido como procesarlos con un analizador SAX porque las clases generadas contienen toda la l�gica del DTD, por lo tanto evitan la interpretaci�n din�mica que el analizador SAX debe realizar. El hecho de que JAXB requiera un DTD no lo hace menos flexible que JAXP, sino que adem�s este requerimiento garantiza que s�lo se procesar�n los datos que sean v�lidos. Esta garant�a es muy importante, especialmente si una aplicaci�n recibe datos desde otra fuente. Si una aplicaci�n no tiene un DTD, no puede determinar el significado de los datos y c�mo deberian ser procesados. Otra ventaja que JAXB tiene sobre JAXP es que nos permite especificar c�mo se genera neustro c�digo desde nuestro DTD, incluyendo los tipos de datos que un elemento de uni�n acepta y devuelve.

Claramenete, JAXP y JAXB tienen sus propias ventajas y desventajas, que nosotros necesitaremos considerar cuando elijamos el API para procesar datos XML. Estas dos listas sumarizan las ventajas de JAXB y JAXP para que podamos decidir cu�l es el correcto para nuestra aplicacion:

Usaremos JAXB cuando queramos:

  • Acceder a datos en memoria, pero no necesitemos capacidades de manipulaci�n.
  • Procesar s�lo datos que son v�lidos.
  • Convertir datos a diferentes tipos.
  • Generar clases basadas en un DTD.
  • Construir representaciones Objetos de datos XML.

Usaremos JAXP cuando queramos:

  • Tener flexibilidad en la forma de acceder a nuestros datos: serialmente con SAX o aleatoriamente en memoria con DOM.
  • Usar el mismo c�digo de proceso con documentos basados en diferentes DTDs.
  • Analizar documentos que no sean necesariamente v�lidos.
  • Aplicar transformaciones XSLT.
  • Insertar o eliminar objetos desde un �rbol de objetos que representa datos XML.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO