Introducción a la Arquitectura de API Java para Uniones XML (JAXB)
JAXB proporciona a una manera rápida, conveniente de crear uniones de dos vías entre los documentos XML y los objetos Java.
Dado un esquema, que especifica la estructura de los datos XML, el compilador JAXB genera un conjunto
de clases de Java que contienen todo el código para analizar los documentos XML basados en el esquema. Una aplicación que
utilice las clases generadas puede construir un árbol de objetos Java que representa un documento XML, manipular el contenido
del árbol, y regenerar los documentos del árbol, todo ello en XML sin requerir que el desarrollador escriba código de análisis
y de proceso complejo.
¿Por qué usar JAXB?
Usar JAXB para una aplicación de proceso de datos tiene muchos benficios porque una aplicación
JAXB:
- Usa Tecnología Java y XML
- Garantiza Datos Válidos
- Es Rápida
- Es Fácil de Usar
- Puede Restringir Datos
- Es Personalizable
- Es Extensible
Esta sección explica todas esas cualidades en más detalle.
Las aplicaciones JAXB usan Tecnología Java y XML
Las razones más importantes para utilizar JAXB son que las aplicaciones de JAXB
están escritas en el lenguaje de programación de Java y pueden procesar datos XML. Para entender las implicaciones de estas
características, primero necesitamos entender por qué XML y la tecnología de Java son tan importantes y cómo se complementan.
XML es una forma estándar industrial e independiente del sistema de representar datos. Los datos que se representan usando
XML se pueden publicar en múltiples medios porque, al contrario que el HTML, XML describe la estructura de los datos, no su
formato. Los datos de XML se pueden pasar entre aplicaciones porque la estructura de los datos se puede especificar en un
esquema, lo que permite que un analizador de sintaxis valide y procese los datos que siguen el esquema. XML no proporciona un
conjunto de etiquetas como el HTML; utilizamos el esquema para definir nuestras propias etiquetas para describir nuestros datos.
Los datos XML son fáciles de trabajar porque están escritos en un formato de texto simple, legible por los seres humanos y el
software de edición de texto. Por estas razones, XML se está convirtiendo rápidamente en un método común para el intercambio
de datos entre aplicaciones, especialmente aplicaciones de empresa de negocio-a-negocio.
Las aplicaciones escritas en el lenguaje de programación de Java son portables: Cualquier sistema con una máquina virtual Java
puede ejecutar los bytecode producidos compilando una aplicación Java. Con el código portable que la tecnología de Java
proporciona, XML es aún más útil en el contexto de compartir datos entre las aplicaciones. Las aplicaciones, especialmente
aplicaciones basadas en Web, necesitan la ayuda de la tecnología de Java para analizar y procesar los datos de una manera
independiente de la plataforma. Asimismo, las aplicaciones Java necesitan el formato de datos independiente de la plataforma
que XML proporciona para comunicar y compartir información.
Esencialmente, JAXB proporciona un puente entre estas dos tecnologías complementarias.
JAXB incluye un compilador que asocia un esquema a un conjunto de clases Java. Una vez que tengamos
nuestras clases, podremos construir las representaciones de objetos Java de los datos XML que siguen las reglas que el esquema
define. Al igual que un documento XML es un ejemplar de un esquema, un objeto Java es un ejemplar de una clase. Así,
JAXB permite que creemos los objetos Java en el mismo nivel conceptual que los datos XML. La
representación de nuestros datos de esta manera permite que los manipulemos de manera semejante como manipulariámos
objetos de Java, haciéndo más fácil la creación de aplicaciones para procesar datos XML. Una vez que tengamos nuestros datos en
la 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 documento XML. Con el acceso fácil a los datos XML que proporciona JAXB, solamente necesitamos
escribir aplicaciones que realmente utilizarán los datos, en vez gastar el tiempo en escribir código para formatear los datos.
Las Aplicaciones JAXB Garantizan Datos Válidos
Como JAXB asocia esquemas a las clases, debemos tener un esquema para utilizar
JAXB. Algunos analizadores de sintaxis y procesadores de XML no utilizan o no requieren esquemas.
Estos procesadores pueden ser más flexibles que JAXB, pero sin un esquema no pueden garantizar
que sus datos sean válidos. JAXB, por otra parte, puede garantizar ésto. De hecho, es imposible utilizar
JAXB para crear un árbol de objetos Java de un documento XML que sea inválido con respecto al
esquema usado para crear las clases.
Las Aplicaciones JAXB son Rápidas
Dos APIs de uso general para analizar XML son SAX (API simple para XML) y DOM
(modelo del objeto del documento). Un analizador de sintaxis de SAX es un analizador de sintaxis dirigido por eventos, lo
que significa que reacciona a los pedazos del documento mientras lo está analizando; no salva ninguna parte del documento
en memoria. Un analizador de sintaxis de DOM construye una estructura de datos del documento en la memoria cuyo contenido
puede ser manipulado, pero es mucho más lento que un analizador de sintaxis SAX. Una aplicación JAXB,
por otra parte, tiene la velocidad de un analizador de sintaxis SAX y de la capacidad de almacenaje de datos de un
analizador de sintaxis DOM. Aunque los analizadores de sintaxis SAX son rápidos, los primeros prototipos de
JAXB han demostrado que JAXB puede ser más rápido que los analizadores de sintaxis
SAX. JAXB hace más rápidamente el análisis porque las clases generadas están precompiladas y contienen
la lógica del esquema, de tal modo que evitan la interpretación dinámica que un analizador de sintaxis SAX debe realizar.
Una aplicación JAXB puede construir una estructura de datos en memoria como un analizador de sintaxis
DOM. Sin embargo, al contrario que DOM, no incluye muchas de las funciones adicionales para la manipulación del árbol. Al
contrario que una aplicación DOM, una aplicación JAXB es específica de un esquema: No podemos utilizarla
para procesar los documentos de XML que se basan en otro esquema. Por estas razones, una aplicación JAXB
utiliza mucho más eficientemente la memoria que DOM.
Las Aplicaciones JAXB son Fáciles de Crear y de Usar
Puesto que todo el código de proceso se genera por nosotros, JAXB es más fácil de utilizar que la mayoría
de los analizadores de sintaxis XML: Con sólo un stream de entrada podemos tener acceso al contenido. Además, la mayoría de
los analizadores de sintaxis XML se limitan al tipado de datos ofrecido por un DTD. Un DTD es un tipo de lenguaje de esquema de
XML. Todavía necesitamos proporcionar al código de conversión, que puede ser propenso a errores y difícil de mantener.
JAXB genera automáticamente el código que podemos personalizar para que realice la conversión de contenidos por
nosotros.
Si sabemos cómo programar en el lenguaje Java y tenemos un mínimo conocimiento de XML, podremos empezar a usar
JAXB. Además, como las clase generadas cumplen las convenciones del API Java, es incluso más
fácil empezar a trabajar con JAXB.
Las Aplicaciones JAXB Pueden Convertir Datos
Aunque un documento de XML está especificado para un esquema, en este momento, un esquema está limitado en cómo puede especificar
firmemente el contenido de un documento de XML. las aplicaciones de intercambio de datos necesitan tipado de datos formal.
XML 1,0 no proporciona explícitamente a tipado de datos más allá de expresar tipos como valores del atributo; estos valores del
atributo deben entonces ser interpretados analizando el código proporcionado. Es decir podemos incorporar cualquier tipo de
datos que deseemos entre dos etiquetas, tales como números enteros o cadenas, mientras la estructura del documento esté conforme
con la especificación del DTD. Pero lo que desearemos con frecuencia es poder convertir los datos, por ejemplo, para especificar
que solamente un número entero se puede contener entre dos etiquetas <quantity>. JAXB proporciona
capacidades tanto para la estructura como para la validación del contenido en el código generado, que podemos personalizar.
Más importante, puesto que JAXB genera el código Java, podemos asignar tipos exclusivos del lenguaje de programación
Java, tal como Date o BigDecimal, a nuestros elementos. Para instrucciones
de cómo realizar conversiones de tipos, pudes ir a la página Unir un Esquema a las Clases.
Las Aplicaciones JAXB Pueden Personalizarse
Antes de generar las clases Java dedese nuestro DTD, escribimos lo que se llama un esquema de unión, que contiene instrucciones de
cómo generar las clases. El esquema de unión se escribe en un lenguaje de unión basado en XML, cuyas construcciones utilizamos
para escribir al esquema de unión de modo que podamos especificar cómo se generan las clases. Una de las personalizaciones más
útiles son las conversiones de tipos de datos. Por ejemplo, como se mencionó en secciones anteriores, podemos especificar en el esquema
de unión que el elemento quantity sólo debe contener números enteros. Además de las conversiones de tipos
de datos, podemos utilizar el esquema de unión para controlar los nombres de las clases, los paquetes, y los tipos; y podemos generar
constructores, interfaces, y enumeraciones personalizadas.
El esquema de unión también permite que manejemos la evolución del esquema. Si nos anticipamos la cambio de nuestro esquema, el esquema
de unión proporcionará constructores especiales que definen uniones flojas que permitan más flexibilidad. Cuando el esquema se desarrolle,
todo lo que necesitamos hacer es editar el esquema de unión y ejecutar el compilador del esquema otra vez para crear las clases que
reflejan los cambios. Si intentaramos cambiar las clases en lugar del esquema, una vez que ejecutaramos el compilador del esquema
otra vez, los cambios serían sobreescritos. Porque las instrucciones de unión se especifican en el esquema de unión -- a parte del
esquema y el código -- cuando se desarrolle el esquema, lo tendremos mucho más fácil para mantener la aplicación.
Las Aplicaciones JAXB son Extensibles
Una vez que hayamos generado las clases Java, podremos utilizarlas sin modificaciones, o subclasificarlas para proporcionar
funcionalidades adicionales. Los desarrolladores de JAXB diseñaron el proceso de unión para hacer que la
derivación de subclases sea sencillo. Puedes encontrar más información en el capitulo Trabajar con
Datos
Usos de JAXB
JAXB tiene muchas aplicaciones, especialmente con el advenimiento las las aplicaciones de empresa de
negocio-a-negocio basadas en Web. Sin embargo, no tenemos que ser un desarrolador Web para apreciar JAXB porque
JAXB proporciona una forma fácil de trabajar con datos, tanto si nos proponemos compartirlos como si no.
Esta sección describe dos escenarios para demostrar cómo se puede usar JAXB en el mundo real.
Escenario 1: Balance de un Libro de Cheques
Podemos utilizar JAXB para crear una aplicación de escritorio simple para el balance de libros
de cheques. Un esquema que representa un libro de cheques podría contener un conjunto de transacciones y un balance. Con las clases
generadas desde el esquema de transacciones podemos crear datos XML para un conjunto de transacciones mensuales. Cada mes podríamos:
- Crear una representación objeto de los datos del libro de cheques XML.
- Crear una representación objeto de las transaciones de ese mes.
- Calcular el nuevo balance con los objetos.
- Añadir los datos del objeto de transaciones a los datos del libro de cheques.
- Escribir el libro de cheques actualizado en un nuevo fichero XML.
Escenario 2: Comparar Precios de Suministradores
Supongamos que somos fabricantes de zapatos y quisieramos encontrar un suministrador del cordones con los mejores precios.
En un entorno de servicios Web, los suministradores pueden hacer negocio sobre Internet, representando datos como sus listas
de precios en XML. Con esquemas estándars para representar datos compartidos a través de un repositorio, los negocios pueden
compartir estos datos. Un cliente podría tener acceso al esquema estándar del repositorio y construir una aplicación
JAXB. Una vez que se construya la aplicación, el cliente puede solicitar las listas de precios a los
distintos suministradores. Estas listas de precios está en formato XML y serán válidas contra el esquema estándar de la lista
de precios. Cuando la aplicación JAXB extrae los datos XML, crea las representaciones objeto Java de los datos.
Con los objetos, la aplicación JAXB puede comparar los precios de los productos que le interesan al cliente y
puede generar los nuevos datos XML, que contiene solamente esos items que ella desea comprar. Si el cliente también construyó una
aplicación JAXB con un esquema estándar del formulario de pedido, podría corregir sus nuevos datos de la lista
de precios XML y agregarlos a los datos del formulario de pedido XML, que puede enviar al suministrador con los precios más bajos.
Para poner el segundo decorado en marcha, además de JAXB, necesitaríamos utilizar otras tecnologías, tales como
el API Java para Mensajería XML (JAXM) para enviar los datos y el API Java para Registros XML (JAXR) para utilizar el
repositorio. El primer decorado se puede poner en marcha usando solamente JAXB. Como esta guía se centra en
JAXB, el decorado de la aplicación del libro de cheques se utilizará como ejemplo. Comenzando con el
Capítulo 4: Unir un Esquema a las clases, esta guía muestra cómo construir una
aplicación JAXB con el ejemplo del libro de cheques.