加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 08:10:23 所属栏目:百科 来源:网络整理
导读:也许一个愚蠢的问题:我有一个类型 Data我想要封送到一个XML文件。这是我的类数据库包含一个ArrayList … @XmlRootElementpublic class Database{ ListData records = new ArrayListData(); public ListData getRecords() { return records; } public void s
也许一个愚蠢的问题:我有一个类型< Data>我想要封送到一个XML文件。这是我的类数据库包含一个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; }
}

…这是类Data:

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

…我得到的结果:

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

在稍微修改一下测试类:

...
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文件结构创建一个Java类结构的推荐方法吗?

在记录属性上添加:
@XmlElementWrapper(name="records")
@XmlElement(name="data")

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

> JAXB & Collection Properties

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读