也许有一个愚蠢的问题:我有一个<Data>
类型的List
,我想将它编组到一个XML文件中。这是我的包含ArrayList
的类Database
...
@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; }
}
...and这是类数据:
// @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; }
}
使用下面的测试类...
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"));
}
}
...I得到了结果:
<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>
这是推荐的根据上述文件结构创建Java类结构的方法吗?
发布于 2010-09-10 17:56:06
在记录属性上添加:
@XmlElementWrapper(name="records")
@XmlElement(name="data")
有关JAXB和集合属性的详细信息,请参阅:
发布于 2010-09-11 01:15:42
这是对你的第二个问题的回答:
这两种方法都将生成相同的XML。我的建议是使用最适合您的应用程序的模型。对我来说,这通常是使用@XmlElementWrapper/@XmlElement。因为“记录”只是用来组织“数据”元素的,所以它并不真正值得拥有自己的类。
我负责MOXy JAXB的实现,我们提供了一个基于XPath的映射扩展,以超越@XmlElementWrapper的能力:
发布于 2012-08-08 01:49:37
在回答你的第二个问题时:
Is this the recommended way to create a Java class structure
according to the XML file structure above?
从技术上讲,引入额外的Records
类来解决JAXB问题是不必要的,也是多余的工作,因为JAXB不需要它。@XmlElementWrapper
和@XmlElement
name
属性是为解决您的问题而设计的。
从您对Blaise的回答的评论中,我维护了一个包含操作示例的tutorial,用于解释如何处理List等泛型类。解组时。
https://stackoverflow.com/questions/3683598
复制相似问题