Javadabbadoo.org - Tu comunidad Java parlante XML
Inicio | Cursos infosintesis.net liberados | Java SE Avanzado | Mani. Doc. XML con JAXB a partir de un XML Schema
Manipular un Documento XML con JAXB a partir de un XML Schema
Paso 1: Fundamentos

JAXB (Java Architecture for XML Binding) es una API que nos permite manipular documentos XML desde un entorno Java de forma transparente.

Gracias al compilador de JAXB (schema compiler) a través del comando xjc se generan una serie de Clases Java que van a ser llamadas desde nuestras aplicaciones a través de setters y getters para así de esta forma obtener, modificar o crear los datos de un documento XML.

El compilador JAXB necesita previamente un XML Schema para poder crear la estructura de las Clases Java que el comando xjc ha creado. De esta forma podemos parsear un documento XML de forma transparente.

Pasos a seguir para parsear un documento XML

Primero de todo tenemos que crear un XML schema que en nuestro caso se va a llamar pedido.xml

Este es el código del XML schema pedido.xml

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified">
 <xsd:element name="pedido" type="PedidoType"/>

 <xsd:element name="comentario" type="xsd:string"/>

 <xsd:complexType name="PedidoType">
  <xsd:sequence>
   <xsd:element name="enviarA" type="DireccionEEUU"/>
   <xsd:element name="facturarA" type="DireccionEEUU"/>
   <xsd:element ref="comentario" minOccurs="0"/>
   <xsd:element name="articulos" type="Articulos"/>
  </xsd:sequence>
  <xsd:attribute name="fechaPedido" type="xsd:date"/>
 </xsd:complexType>

 <xsd:complexType name="DireccionEEUU">
  <xsd:sequence>
   <xsd:element name="nombre" type="xsd:string"/>
   <xsd:element name="calle" type="xsd:string"/>
   <xsd:element name="ciudad" type="xsd:string"/>
   <xsd:element name="estado" type="xsd:string"/>
   <xsd:element name="codigoPostal" type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="pais" type="xsd:NMTOKEN" fixed="EEUU"/>
 </xsd:complexType>

 <xsd:complexType name="Articulos">
  <xsd:sequence>
   <xsd:element name="articulo" minOccurs="1" maxOccurs="unbounded">
    <xsd:complexType>
     <xsd:sequence>
      <xsd:element name="nombreProducto" type="xsd:string"/>
      <xsd:element name="cantidad">
       <xsd:simpleType>
        <xsd:restriction base="xsd:positiveInteger">
         <xsd:maxExclusive value="100"/>
        </xsd:restriction>
       </xsd:simpleType>
      </xsd:element>
      <xsd:element name="precioEEUU" type="xsd:decimal"/>
      <xsd:element ref="comentario" minOccurs="0"/>
      <xsd:element name="fechaEnvio" type="xsd:date" minOccurs="0"/>
     </xsd:sequence>
     <xsd:attribute name="codigoStock" type="SKU" use="required"/>
    </xsd:complexType>
   </xsd:element>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:simpleType name="SKU">
  <xsd:restriction base="xsd:string">
   <xsd:pattern value="\d{3}-[A-Z]{2}"/>
  </xsd:restriction>
 </xsd:simpleType>
</xsd:schema>

Para obtener los POJOs (Plain Old Java Objects) se tiene que ejecutar el comando xjc. De esta forma obtenemos una Clase por cada uno de los tipos complejos del XML Schema.

En nuestro caso se van a crear las Clases PedidoType.java, Articulos.java y DirecccionEEUU.java correspondientes a los tipos complejos <xsd:complexType name="PedidoType">,  <xsd:complexType name="Articulos"> y <xsd:complexType name="DireccionEEUU">. También se crea la Clase a modo de factoría de objetos llamada ObjectFactory.java.

Una vez ya se han obtenido las Clases Java, se compilan a través del comando javac y obtemos en nuestro caso los ficheros PedidoType.class, Articulos.class, Articulos$Articulo.class, DirecccionEEUU.class y ObjectFactory.class.

A partir de un documento XML que es validado por su correspondiente XML schema se crea un árbol de objetos que representan los diferentes tipos complejos y la factoría de dichos objetos. A este proceso de instanciación de objetos se le denomina unmarshal.

Este es el código del documento XML pedido.xml

<?xml version="1.0" encoding="UTF-8"?>

<pedido xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
        xsi:noNamespaceSchemaLocation='pedido.xsd'>
 <enviarA pais="EEUU">
  <nombre>Alice Smith</nombre>
  <calle>123 Maple Street</calle>
  <ciudad>Cambridge</ciudad>
  <estado>MA</estado>
  <codigoPostal>12345</codigoPostal>
 </enviarA>
 <facturarA>
  <nombre>John Bob</nombre>
  <calle>242 Main Street</calle>
  <ciudad>Beverly Hills</ciudad>
  <estado>CA</estado>
  <codigoPostal>90210</codigoPostal>
 </facturarA>
 <comentario>Líneas de pedido</comentario>
 <articulos>
  <articulo codigoStock=
"872-AA">
   <nombreProducto>Cortacésped</nombreProducto>
   <cantidad>1</cantidad>
   <precioEEUU>148.95</precioEEUU>
   <comentario>Eléctrico con baterías recargables</comentario>
   <fechaEnvio>2006-06-28</fechaEnvio>
  </articulo>
  <articulo codigoStock=
"926-BC">
   <nombreProducto>Bolsa de tierra de abono marca Acme</nombreProducto>
   <cantidad>1</cantidad>
   <precioEEUU>7.20</precioEEUU>
  </articulo>
 </articulos>
</pedido>

Este es el árbol de objetos creado en memoria a través del proceso unmarshal

Una vez se han seguido los pasos anteriores, parsear un documento XML es tan sencillo como acceder a los métodos getters y setters del árbol de objetos generados por el proceso unmarshal. En nuestro caso desde nuestra aplicación por ejemplo podremos modificar la dirección de facturación a través de métodos setters a la variable de referencia facturarA, o añadir nuevos articulos a la lista de articulos.

Después de realizar los cambios pertinenentes se utiliza el proceso marshal para sobreescribir el documento XML o crear un nuevo documento XML.

Página anterior
Ignasi Pérez Valls
Infosintesis Solutions Group


Marzo 2009
Dudas y comentarios: Foro [2-06] XML - XML Schema
 
 
 
 
JavaDabbaDoo.org
Tu comunidad Java parlante. Cursos abiertos, tutoriales y mucho mucho más ...