首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JAXB:如何封送列表中的对象?

JAXB:如何封送列表中的对象?
EN

Stack Overflow用户
提问于 2010-09-10 17:43:10
回答 3查看 96.4K关注 0票数 67

也许有一个愚蠢的问题:我有一个<Data>类型的List,我想将它编组到一个XML文件中。这是我的包含ArrayList的类Database ...

代码语言:javascript
复制
@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这是类数据:

代码语言:javascript
复制
// @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; }
}

使用下面的测试类...

代码语言:javascript
复制
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得到了结果:

代码语言:javascript
复制
<database>
    <records>
        <address>Cologne</address>
        <name>Peter</name>
    </records>
    <records>
        <address>Hamburg</address>
        <name>Mary</name>
    </records>
</database>

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

代码语言:javascript
复制
<database>
    <records>
        <data>
            <address>Cologne</address>
            <name>Peter</name>
        </data>
        <data>
            <address>Hamburg</address>
            <name>Mary</name>
        </data>
    </records>
</database>

另一个问题:如果我想在不使用的情况下使用@XmlElementWrapper@XmlElement注释来处理问题,我可以引入一个中间类

代码语言:javascript
复制
public class Records
{
    List<Data> data = new ArrayList<Data>();

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

由修改后的基类使用

代码语言:javascript
复制
@XmlRootElement
public class Database
{
    Records records = new Records();

    public Records getRecords()                { return records; }
    public void    setRecords(Records records) { this.records = records; }
}

在稍微修改过的Test类中:

代码语言:javascript
复制
...
Database database = new Database();
database.getRecords().getData().add(data1);
database.getRecords().getData().add(data2);
...

结果也是:

代码语言:javascript
复制
<database>
    <records>
        <data>
            <address>Cologne</address>
            <name>Peter</name>
        </data>
        <data>
            <address>Hamburg</address>
            <name>Mary</name>
        </data>
    </records>
</database>

这是推荐的根据上述文件结构创建Java类结构的方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-10 17:56:06

在记录属性上添加:

代码语言:javascript
复制
@XmlElementWrapper(name="records")
@XmlElement(name="data")

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

票数 109
EN

Stack Overflow用户

发布于 2010-09-11 01:15:42

这是对你的第二个问题的回答:

这两种方法都将生成相同的XML。我的建议是使用最适合您的应用程序的模型。对我来说,这通常是使用@XmlElementWrapper/@XmlElement。因为“记录”只是用来组织“数据”元素的,所以它并不真正值得拥有自己的类。

我负责MOXy JAXB的实现,我们提供了一个基于XPath的映射扩展,以超越@XmlElementWrapper的能力:

票数 6
EN

Stack Overflow用户

发布于 2012-08-08 01:49:37

在回答你的第二个问题时:

代码语言:javascript
复制
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等泛型类。解组时。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3683598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档