JAXB: ARQUITECTURA JAVA PARA XML BINDING
The Java(TM) Web Services Tutorial
Aunque es fundamental para comprender el esquema interno de XML, la utilización de JAXP (ya sea DOM o SAX) como parser se hace muy incómodo. Ya desde hace años JDOM viene a solucionar este problema, pero hacía falta una estandarización. JAXB puede resolver este problema.
Esto no quiere decir que DOM o SAX -en particular este último- dejen de utilizarse.
En JAXB tenemos dos pasos:
1. Enlazar (bind) el esquema para el documento XML.
2. Deserializar (unmarshal) el XML a objetos Java.
1. Binding
Primero, es necesario que el sistema comprenda cuál es la estructura del XML, lo cuál se realiza mediante la transformación del XmlSchema del documento a clases e interfaces Java.
JAXB exige que el XML tenga un esquema, y que cumpla el W3C XML Schema Language.
Para ello, se utiliza el Xml Java Compiler (xjc), que se encuentra en\jaxb\bin:
xjc -p <package> <XmlSchema>.xsd -d <directorio destino>
, que genera un conjunto de clases e interfaces, generalmente -por lo que estoy viendo-, para los elementos y los tipos compuestos, además de algún factory. Cada clase define sus métodos getter y setter para cada tipo de elemento y atributo.
2. Unmarshalling
Este paso crea, a partir de un fichero XML, un conjunto de instancias de las clases anteriormente generadas con xjc, en memoria.
Además de eso, el framework JAXB provee:
- javax.xml.bind: marshalling, unmarshalling, validación.
- javax.xml.bind.util: clases de utilidad.
- javax.xml.bind.helper: proveedores de implementación.
Sin meternos en detalles de implementación -para eso está el enlace de arriba-, la idea es que JAXB, al pasarle el nombre del XML, nos devuelve la instancia de la clase "root" del fichero XML -p.e. si el root se llama "Ciudad", la clase será Ciudad-.
Aunque no lo he probado, se supone que se puede realizar este proceso sobre multitud de fuentes: InputStreams, URLs, DOMs, o incluso eventos SAX!
Creación de un Documento
Los pasos son fáciles de imaginar:
1. Binding -como antes-.
2. Creación del Content Tree. Se crea el root del XML.
3. Marshalling.
Transformación a fichero XML.
Anotaciones
Hasta ahora hemos dado por hecho que los tipos de dato que selecciona el compilador xjc son los adecuados para nosotros, pero ¿y si no es así? ¿Y si deseamos que una de las clases generadas se llame de una manera determinada, o que un tipo XML se transforme a otro Java que no es el estándar?
Respuesta: Anotaciones XML. Forma parte del XmlSchema, normalmente arriba del todo, y define qué cambios con respecto a lo definido por defecto tiene que haber.
The Java(TM) Web Services Tutorial
Aunque es fundamental para comprender el esquema interno de XML, la utilización de JAXP (ya sea DOM o SAX) como parser se hace muy incómodo. Ya desde hace años JDOM viene a solucionar este problema, pero hacía falta una estandarización. JAXB puede resolver este problema.
Esto no quiere decir que DOM o SAX -en particular este último- dejen de utilizarse.
En JAXB tenemos dos pasos:
1. Enlazar (bind) el esquema para el documento XML.
2. Deserializar (unmarshal) el XML a objetos Java.
1. Binding
Primero, es necesario que el sistema comprenda cuál es la estructura del XML, lo cuál se realiza mediante la transformación del XmlSchema del documento a clases e interfaces Java.
JAXB exige que el XML tenga un esquema, y que cumpla el W3C XML Schema Language.
Para ello, se utiliza el Xml Java Compiler (xjc), que se encuentra en
xjc -p <package> <XmlSchema>.xsd -d <directorio destino>
, que genera un conjunto de clases e interfaces, generalmente -por lo que estoy viendo-, para los elementos y los tipos compuestos, además de algún factory. Cada clase define sus métodos getter y setter para cada tipo de elemento y atributo.
2. Unmarshalling
Este paso crea, a partir de un fichero XML, un conjunto de instancias de las clases anteriormente generadas con xjc, en memoria.
Además de eso, el framework JAXB provee:
- javax.xml.bind: marshalling, unmarshalling, validación.
- javax.xml.bind.util: clases de utilidad.
- javax.xml.bind.helper: proveedores de implementación.
Sin meternos en detalles de implementación -para eso está el enlace de arriba-, la idea es que JAXB, al pasarle el nombre del XML, nos devuelve la instancia de la clase "root" del fichero XML -p.e. si el root se llama "Ciudad", la clase será Ciudad-.
Aunque no lo he probado, se supone que se puede realizar este proceso sobre multitud de fuentes: InputStreams, URLs, DOMs, o incluso eventos SAX!
Creación de un Documento
Los pasos son fáciles de imaginar:
1. Binding -como antes-.
2. Creación del Content Tree. Se crea el root del XML.
3. Marshalling.
Transformación a fichero XML.
Anotaciones
Hasta ahora hemos dado por hecho que los tipos de dato que selecciona el compilador xjc son los adecuados para nosotros, pero ¿y si no es así? ¿Y si deseamos que una de las clases generadas se llame de una manera determinada, o que un tipo XML se transforme a otro Java que no es el estándar?
Respuesta: Anotaciones XML. Forma parte del XmlSchema, normalmente arriba del todo, y define qué cambios con respecto a lo definido por defecto tiene que haber.
Comments