La clase que utilizaremos:
public class XMLDataBinding {
private XMLContext ctx;
public XMLDataBinding(){
this.ctx = new XMLContext();
}
public Object readXML(Reader xml, Class clazz) throws MarshalException, ValidationException, SAXException, IOException{
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setClass(clazz);
return unmarshaller.unmarshal(new InputSource(xml));
}
public static Object xml2Object(Reader xml, Class clazz) throws MarshalException, ValidationException{
return Unmarshaller.unmarshal(clazz, xml);
}
public String writeXML(Object object) throws MarshalException, ValidationException, IOException{
StringWriter writer = new StringWriter();
Marshaller marshaller = context.createMarshaller();
marshaller.setWriter(writer);
marshaller.marshal(object);
return writer.getBuffer().toString();
}
public static String object2XML(Object object) throws MarshalException, ValidationException{
StringWriter writer = new StringWriter();
Marshaller.marshal(object, writer);
return writer.getBuffer().toString();
}
public void addMappingToContext(Reader mappingFile) throws MappingException{
Mapping mapping = this.ctx.createMapping();
mapping.loadMapping(new InputSource(mappingFile));
this.ctx.addMapping(mapping);
}
public void addMappingToContext(InputStream mappingFile) throws MappingException{
Mapping mapping = this.ctx.createMapping();
mapping.loadMapping(new InputSource(mappingFile));
this.ctx.addMapping(mapping);
log.debug("Mapping loaded: " + mappingFile);
}
public XMLContext getXMLContext(){
return this.ctx;
}
}
Las clase que utilizaremos para convertirlas a xml son relativamente sencillas (sino nos aburrimos todos), lo haremos con dos clases unicamente:
El mapeo es el siguiente:
public class Persona implements Serializable {
private static final long serialVersionUID = 1L;
private String nombre;
private String apellido;
private int edad;
private ArrayList telefonos;
private Automovil automovil;
public Persona(){
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public List getTelefonos() {
return telefonos;
}
public void setTelefonos(ArrayList telefonos) {
this.telefonos = telefonos;
}
public Automovil getAutomovil() {
return automovil;
}
public void setAutomovil(Automovil automovil) {
this.automovil = automovil;
}
public String getNombreCompleto(){
return this.nombre + “ ” + this.apellido;
}
}
public class Automovil implements Serializable {
private static final long serialVersionUID = 1L;
private String marca;
private String modelo;
private String placa;
public Automovil(){
}
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
public String getPlaca() {
return placa;
}
public void setPlaca(String placa) {
this.placa = placa;
}
}
Persona persona = new Persona();
persona.setNombre("nombre");
persona.setApellido("apellido");
persona.setEdad(100);
ArrayList telefonos = new ArrayList();
telefonos.add("12345");
telefonos.add("56789");
persona.setTelefonos(telefonos);
Automovil auto = new Automovil();
auto.setMarca("marca");
auto.setModelo("modelo");
auto.setPlaca("SV123465");
persona.setAutomovil(auto);
XMLDataBinding db = new XMLDataBinding();
db.addMappingToContext("test/castor/xml/PersonaMapping.xml");
System.out.println(db.writeXML(persona));
El xml que obtenemos como resultado es el siguiente:
La lectura de un xml podriamos hacerla con el mismo xml que hemos generado y la misma instancia del objeto XMLDataBinding:
Persona p = (Persona)db.readXML(new StringReader(xml), Persona.class);



