Unmarshalling xml usando el xsd y jaxb

Unmarshalling es el proceso de conversión de un XML a un objeto en Java, hay muchas maneras de conseguir esto, las dos que conozco son usando Apache commons Digester y jaxb, y es precisamente ésta última la que explicaré en este post por ser una manera mucho más rápida de hacerlo (además de ser el estándar) . Para continuar necesitarás entenderás para que sirve el XML Schema, que no es más que un xml describiendo la estructura de otro xml. Esto no lo explicaré aqui, pero si deseas una introducción a XML Schema, este sitio puede resultarte útil: http://www.w3schools.com/schema/

Entonces, tenemos un Xml Schema como éste:


persona.xsd

<?xml version="1.0" encoding="windows-1252"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xsd:element name="personas">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="persona" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="nombre" type="xsd:string" />
<xsd:element name="apellidos" type="xsd:string" />
<xsd:element name="documento" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>

Y este es el xml que queremos convertir en una colección de objetos.


personas.xml

<?xml version="1.0" encoding="UTF-8"?>
<personas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="persona.xsd">
<persona>
<nombre>Jaime</nombre>
<documento>456789132</documento>
<apellidos>Hablutzel</apellidos>
</persona>
<persona>
<nombre>Patricia</nombre>
<documento>1234589</documento>
<apellidos>Fernandez</apellidos>
</persona>
<persona>
<nombre>Pepe</nombre>
<documento>xxx-xxx-xxx</documento>
<apellidos>Grillo</apellidos>
</persona>
<persona>
<nombre>Silvester</nombre>
<documento>yy-xxx-xxx</documento>
<apellidos>Stallone</apellidos>
</persona>
</personas>

Entonces usamos la herramienta xjc (viene por defecto en la distrubución del jdk), así que si tenemos $JAVA_HOME/bin en la variable de entorno PATH, solo tenemos que abrir una consola y:

$ xjc persona.xsd

con lo cual se generarán dos clases, pero para éste ejemplo solo usaremos una, la clase Personas.java que se verá como ésta


package com.imageneureka.jaxb;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "persona" })
@XmlRootElement(name = "personas")
public class Personas {
protected List<Personas.Persona> persona;
public List<Personas.Persona> getPersona() {
if (persona == null) {
persona = new ArrayList<Personas.Persona>();
}
return this.persona;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "nombre", "apellidos", "documento" })
public static class Persona {
@XmlElement(required = true)
protected String nombre;
@XmlElement(required = true)
protected String apellidos;
@XmlElement(required = true)
protected String documento;
public String getNombre() {
return nombre;
}
public void setNombre(String value) {
this.nombre = value;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String value) {
this.apellidos = value;
}
public String getDocumento() {
return documento;
}
public void setDocumento(String value) {
this.documento = value;
}
}
}

Y por último, hagamos algo útil con la clase jaxb generada.


public class App {
public static void main(String[] args) throws JAXBException {
InputStream is = Class.class
.getResourceAsStream("/com/imageneureka/personas.xml");
JAXBContext jc = JAXBContext.newInstance(Personas.class);
Unmarshaller u = jc.createUnmarshaller();
Personas doo = (Personas) u.unmarshal(is);
List<Persona> yax = doo.getPersona();
for (Persona foo : yax) {
System.out.println(foo.getNombre());
System.out.println(foo.getApellidos());
System.out.println(foo.getDocumento());
System.out.println("------------------");
}

}
}

Como pueden ver usamos la clase generada por la herramienta xjc (Personas.java) para convertir personas.xml en una lista de objetos Persona.

Si prefieren descargarse el ejemplo, pueden encontrarlo aquí:

http://www.2shared.com/file/11145733/854e18f4/jaxbtutorial.html

El proyecto se encuentra manejado con maven y pueden abrirlo con el Netbeans 6.8 o con Eclipse si le instalan un plugin como se explica aquí:

http://hablutzel1.wordpress.com/2009/11/22/how-to-get-into-maven-for-the-first-time/

2 thoughts on “Unmarshalling xml usando el xsd y jaxb”

Leave a Reply

Your email address will not be published. Required fields are marked *