rmv*_*rmv 61 xml arraylist jaxb unmarshalling
也许是一个愚蠢的问题:我有一种List类型<Data>,我想编组成一个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; }
}
Run Code Online (Sandbox Code Playgroud)
......这是班级数据:
// @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; }
}
Run Code Online (Sandbox Code Playgroud)
使用以下测试类......
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"));
}
}
Run Code Online (Sandbox Code Playgroud)
......我得到了结果:
<database>
<records>
<address>Cologne</address>
<name>Peter</name>
</records>
<records>
<address>Hamburg</address>
<name>Mary</name>
</records>
</database>
Run Code Online (Sandbox Code Playgroud)
但那并不是我所期待的,即<Data>对象的所有标签都缺失了.我正在寻找一种方法来导出以下结构中的数据,但我不知道如何实现这一点:
<database>
<records>
<data>
<address>Cologne</address>
<name>Peter</name>
</data>
<data>
<address>Hamburg</address>
<name>Mary</name>
</data>
</records>
</database>
Run Code Online (Sandbox Code Playgroud)
另外一个问题:如果我想在不使用@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; }
}
Run Code Online (Sandbox Code Playgroud)
由修改后的基类使用
@XmlRootElement
public class Database
{
Records records = new Records();
public Records getRecords() { return records; }
public void setRecords(Records records) { this.records = records; }
}
Run Code Online (Sandbox Code Playgroud)
稍微修改一下Test:
...
Database database = new Database();
database.getRecords().getData().add(data1);
database.getRecords().getData().add(data2);
...
Run Code Online (Sandbox Code Playgroud)
结果还是:
<database>
<records>
<data>
<address>Cologne</address>
<name>Peter</name>
</data>
<data>
<address>Hamburg</address>
<name>Mary</name>
</data>
</records>
</database>
Run Code Online (Sandbox Code Playgroud)
这是根据上面的XML文件结构创建Java类结构的推荐方法吗?
bdo*_*han 99
在记录属性上添加:
@XmlElementWrapper(name="records")
@XmlElement(name="data")
Run Code Online (Sandbox Code Playgroud)
有关JAXB和集合属性的更多信息,请参阅:
这是对你的第二个问题的回答:
两种方法都将生成相同的XML.我的建议是使用最适合您应用的模型.对我来说,通常使用@ XmlElementWrapper/@ XmlElement.由于"记录"只是用于组织"数据"元素,因此它并不值得拥有自己的类.
我领导MOXy JAXB实现,我们提供基于XPath的映射扩展,超越了@XmlElementWrapper的功能:
针对你的第二个问题:
Is this the recommended way to create a Java class structure
according to the XML file structure above?
Run Code Online (Sandbox Code Playgroud)
从技术上讲,引入一个额外的Records类来解决您的 JAXB 问题是不必要和多余的工作,因为 JAXB 不需要它。在
@XmlElementWrapper和@XmlElement name财产已被设计为您解决问题。
从您的评论到 Blaise 的回答,我维护了一个带有操作示例的教程,解释了在解组时如何处理泛型类(如 List 等)。
| 归档时间: |
|
| 查看次数: |
87850 次 |
| 最近记录: |