06 marzo 2011

Marshalling and Unmarshalling

Hola primero que nada vamos a explicar que significan estas dos palabras y una breve introduccion de porque surgio el post.
Marshalling: Significa crear un documento XML de un árbol de contenido(En nuestro caso el arbol del contenido seria un Objeto Java).
Unmarshalling: Significa crear un árbol de contenido de un documento XML.
Basicamente esto seria serialization y deserialization.
Este post surgió porque hace un tiempo tuve que hacer un desarrollo donde venia la información en un XML y yo debía parsear el XML aplicar cierta lógica de negocio y devolver un XML como respuesta. Para esto lo único que me brindaron fueron un XML llamado request y otro response.


La verdad es que no tenia muchas ganas de hacer las cosas a mano así que me puse a investigar y encontré algunas cosas bastante interesante, como por ejemplo la API JAXB que es la tecnología de java que provee un API y una herramienta para ligar el esquema XML a una representación en código java.
Básicamente esta API nos provee un conjunto de Annotations y clases para hacer el bindeo entre nuestra estructura en los objetos Java y el XML, o mejor aun si nosotros poseemos el XSD del XML podes utilizar la herramienta xjc (Viene por defecto en la distrubución del jdk) para que nos genere la clases del dominio.

XMLs:


request.xml

<?xml version='1.0' encoding='utf-8' ?>
<Parameters>
  <UserId>AH875</UserId>
  <SystemId>Test</SystemId>
</Parameters> 

response.xml

<?xml version='1.0' encoding='utf-8' ?>
<Response>
  <Status>Ok</Status>
  <Data>
   <SubSystem>
    <SubSystemId>1</SubSystemId>
    <Name>SubSystem1</Name>
   </SubSystem>
   <SubSystem>
    <SubSystemId>2</SubSystemId>
    <Name>SubSystem2</Name>
   </SubSystem>
  </Data>
</Response>

Como les dije antes la verdad no tenia muchas ganas de hacerlo a mano así que empece a buscar una herramienta que genere el XSD en base al XML y encontré una muy buena, les dejo el link
Trang(trang20030619.zip).

Si la bajan y la utilizan lograran obtener los XSD de sus XML aquí les dejo los míos

XSDs:

request.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="Parameters">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="UserId"/>
        <xs:element ref="SystemId"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="UserId" type="xs:NCName"/>
  <xs:element name="SystemId" type="xs:NCName"/>
</xs:schema>

response.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="Response">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Status"/>
        <xs:element ref="Data"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Status" type="xs:NCName"/>
  <xs:element name="Data">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="SubSystem"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="SubSystem">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="SubSystemId"/>
        <xs:element ref="Name"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="SubSystemId" type="xs:integer"/>
  <xs:element name="Name" type="xs:NCName"/>
</xs:schema>


Ahora que tenemos nuestros xsd podemos utilizar xjc para obtener nuestras clases java con sus respectivas annotations.

Les dejo el ejemplo completo para que puedan descargarlo y probarlo. La verdad hay muchas cosas ya resueltas de manera elegante y eficiente solo hace falta conocerlas.

Example.

Saludos,
Luis

Leer más...