Java y XML con JAXB2 (VI)
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/>
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>
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.





