xmlelementwrapper xml jaxb arraylist unmarshalling

xmlelementwrapper - java jaxb xml to object list



JAXB: ¿Cómo ordenar objetos en las listas? (3)

Quizás una pregunta estúpida: tengo una List de tipo <Data> que quiero convertir en un archivo XML. Esta es mi Database clase que contiene una ArrayList ...

@XmlRootElement public class Database { List<Data> records = new ArrayList<Data>(); public List<Data> getRecords() { return records; } public void setRecords(List<Data> records) { this.records = records; } }

... y esta es la clase Datos:

// @XmlRootElement public class Data { String name; String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }

Usando la siguiente clase de prueba ...

public class Test { public static void main(String args[]) throws Exception { Data data1 = new Data(); data1.setName("Peter"); data1.setAddress("Cologne"); Data data2 = new Data(); data2.setName("Mary"); data2.setAddress("Hamburg"); Database database = new Database(); database.getRecords().add(data1); database.getRecords().add(data2); JAXBContext context = JAXBContext.newInstance(Database.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(database, new FileWriter("test.xml")); } }

... Obtuve el resultado:

<database> <records> <address>Cologne</address> <name>Peter</name> </records> <records> <address>Hamburg</address> <name>Mary</name> </records> </database>

Pero eso no es lo que esperaba, es decir, faltan todas las etiquetas de los objetos <Data> . Estoy buscando una forma de exportar los datos en la siguiente estructura, pero no sé cómo lograr esto:

<database> <records> <data> <address>Cologne</address> <name>Peter</name> </data> <data> <address>Hamburg</address> <name>Mary</name> </data> </records> </database>

Una pregunta adicional: si quiero resolver el problema sin utilizar las anotaciones @XmlElementWrapper y @XmlElement , puedo presentar una clase intermedia

public class Records { List<Data> data = new ArrayList<Data>(); public List<Data> getData() { return data; } public void setData(List<Data> data) { this.data = data; } }

utilizado por la clase base modificada

@XmlRootElement public class Database { Records records = new Records(); public Records getRecords() { return records; } public void setRecords(Records records) { this.records = records; } }

en una clase de Test ligeramente modificada:

... Database database = new Database(); database.getRecords().getData().add(data1); database.getRecords().getData().add(data2); ...

El resultado también es:

<database> <records> <data> <address>Cologne</address> <name>Peter</name> </data> <data> <address>Hamburg</address> <name>Mary</name> </data> </records> </database>

¿Es esta la forma recomendada de crear una estructura de clases Java según la estructura de archivos XML anterior?


En la propiedad de registros, agregue:

@XmlElementWrapper(name="records") @XmlElement(name="data")

Para obtener más información sobre JAXB y las propiedades de la colección, consulte:


En respuesta a su segunda pregunta:

Is this the recommended way to create a Java class structure according to the XML file structure above?

Técnicamente hablando, introducir una clase de Records extra para resolver su problema JAXB es un trabajo innecesario y redundante, porque JAXB no lo necesita. La propiedad del name @XmlElementWrapper y @XmlElement ha sido diseñada para resolver su problema.

De sus comentarios a la respuesta de Blaise, mantengo un tutorial con ejemplos operativos que explican cómo se manejan las clases genéricas tales como List, etc. cuando se desmarca.


Esto es en respuesta a su segunda pregunta disquisida una respuesta:

Ambos enfoques generarán el mismo XML. Mi recomendación es ir con el modelo que sea mejor para su aplicación. Para mí, eso generalmente está usando @ XmlElementWrapper / @ XmlElement. Como "registros" está ahí para organizar los elementos de "datos", realmente no merece su propia clase.

Dirijo la implementación MOXy JAXB y ofrecemos una extensión de mapeo basada en XPath para ir más allá de lo que es capaz con @XmlElementWrapper: