JAXB:如何编组列表中的对象?

也许是一个愚蠢的问题:我有一个<Data>types的List ,我想编组成一个XML文件。 这是我的类Database包含一个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; } } 

…这是类数据:

 // @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; } } 

使用以下testing类…

 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")); } } 

我得到了结果:

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

但这并不是我所期望的,也就是说<Data>对象的所有标签都丢失了。 我正在寻找一种方式来导出在以下结构的数据,但我不知道如何实现这一点:

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

还有一个问题:如果我不想使用@XmlElementWrapper@XmlElement注解来处理这个问题,我可以引入一个中间类

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

被修改的基类使用

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

在稍微修改一下Test类:

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

结果也是:

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

这是根据上面的XML文件结构创buildJava类结构的推荐方法吗?

在logging属性上添加:

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

有关JAXB和集合属性的更多信息,请参阅:

  • JAXB和集合属性

这是对你的第二个问题作出回应,否定了一个答案:

  • JAXB:如何编组列表中的对象?

两种方法都会生成相同的XML。 我的build议是最适合您的应用的模型。 对我来说,通常使用@ XmlElementWrapper / @ XmlElement。 由于“logging”只是在那里组织“数据”元素,所以它并不真正拥有自己的类别。

我领导MOXy JAXB实现,我们提供一个基于XPath的映射扩展,超越了使用@XmlElementWrapper的能力:

针对你的第二个问题:

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

从技术上说,引入一个额外的Records类来解决你的JAXB问题是不必要的和冗余的工作,因为JAXB不需要它。 @XmlElementWrapper@XmlElement name属性已经被devise来解决你的问题。

从你的意见到Blaise的答案,我维护一个教程,用操作示例说明如何处理generics类,如List等。