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:
- 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.
- 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.