Java y XML con JAXB2 (VI)

12:24AM dic 17, 2007 en categoria Java por Enrique Rodriguez Lasterra

Etiquetas:


El post de hoy será el último sobre las posibles configuraciones a la hora de compilar el Schema. En el veremos como podemos manejar los tipos simples definidos en el Schema y como relacionar estos con Enumerados Java.

Los Schemas XML cuentan con las posibilidad de definir tipos de datos simples. Estos tipos de datos suelen incorporar restricciones para que solo sean validos algunas valores, en muchos casos, esta restricción es una colección de posibles valores. Para este tipo de restricciones JAXB2 cuenta con herramientas para manejar la configuración  relacionándola con tipos Enumerados, enum, bien de forma global en todo el documento a través de la etiqueta <jxb:globalBindings> y su atributo typesafeEnumBase o bien localmente seleccionando un elemento simple a través de la etiqueta <jxb:typesafeEnumClass/>

Ejemplo: Añadir dos tipos simples en nuestro schema, color con valores posibles rojo, verde y azul y edad-maxima con tres enteros como posibles valores 25, 50 y 75. Estos tipos de datos deben sustituir a los que usan los elementos campo-dos y campo-uno-uno respectivamente. Cambiar la configuración para que se cree el enumerado EdadesMaximas y comprobar que el enum Color ha sido creado de forma automática.

El primer paso será modificar nuestro Schema para que contenga estos tipos simples. Debe quedar así

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://weblogs.javahispano.org/lasterra/jaxb2"
targetNamespace="http://weblogs.javahispano.org/lasterra/jaxb2"
elementFormDefault="qualified">

<xs:element name="elemento-principal">
<xs:complexType>
<xs:choice>
<xs:element name="campo-uno" type="campo-uno"/>
<xs:element name="campo-dos" type="color"/>
<xs:element name="campo-tres" type="xs:int" minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
</xs:element>

<xs:complexType name="campo-uno">
<xs:sequence>
<xs:element name="campo-uno-uno" type="xs:int"/>
<xs:element name="campo-uno-dos" type="edad-maxima" minOccurs="1"/>
</xs:sequence>
<xs:attribute name="attr" type="xs:string"/>
</xs:complexType>
<xs:simpleType name="color">
<xs:restriction base="xs:string">
<xs:enumeration value="rojo"/>
<xs:enumeration value="verde"/>
<xs:enumeration value="azul"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="edad-maxima">
<xs:restriction base="xs:int">
<xs:enumeration value="25"/>
<xs:enumeration value="50"/>
<xs:enumeration value="75"/>
</xs:restriction>
</xs:simpleType>

</xs:schema>

Si compilamos el schema sin tocar la configuración, usando el modo inline introducir los tipos de datos sin tocar los elementos JAXB2, veremos que automáticamente se genera el enumerado Color, porque al tener como base el tipo String, JAXB2 sabe manejarlo.Esto se debe a que el globalBinding por defecto usa en su atributo typesafeEnumBase como tipo de datos base xs:string. Si no deseamos crear ningún tipo de enumerado debemos configurar typesafeEnumBase con valor xs:NCName en el globalBindings.

Sin embargo no ocurre lo mismo con edad-maxima, que debemos configurarlo usando las etiquetas  <jxb:typesafeEnumClass> y <jxb:typesafeEnumMember>  de la siguiente forma

<jxb:typesafeEnumClass name="EdadesMaximas">
<jxb:typesafeEnumMember name="A" value="25"/>
<jxb:typesafeEnumMember name="B" value="50"/>
<jxb:typesafeEnumMember name="C" value="75"/>
</jxb:typesafeEnumClass>

Des esta forma creariamos el enumerado EdadesMaximas con los valores A, B y C.

@XmlType(name = "edad-maxima")
@XmlEnum(Integer.class)
public enum EdadesMaximas {

@XmlEnumValue("25")
A(25),
@XmlEnumValue("50")
B(50),
@XmlEnumValue("75")
C(75);
.....

Seguro que dejo muchas cosas en el tintero pero bien valen estos post para ver las posibilidades de JAXB2 en lo que respecta a lectura y escritura de XML basandonos en un XMLSchema. En los próximos post veremos la capacidad inversa, como dadas unas clases Java podemos leer y escribir XML y generar nuestro XMLSchema para que un tercero pueda hacer lo que hemos visto hasta ahora.

Comentarios:

Enviar un comentario:
Los comentarios han sido deshabilitados.