如何防止JAXB创建中间对象

时间:2012-04-25 21:05:32

标签: java xml jaxb

我想拥有以下XML

<doc>
   <items>
      <item />
      <item />
      <item />
   </items>
   <things>
      <thing />
      <thing />
      <thing />
   </things>
</doc>

架构类似于

<schema>
   <element name="doc">
      <complexType>
          <all>
              <element name="items" minOccurs="1">
                  <complexType>
                       <sequence>
                           <element name="item" minoccurs="0" maxoccurs="unbounded" />
                       </sequence>
                  </complexType>
              </element>
              <element name="things" minOccurs="1">
                  <complexType>
                       <sequence>
                           <element name="thing" minoccurs="0" maxoccurs="unbounded" />
                       </sequence>
                  </complexType>
              </element>
          </all>
      /<complexType>
   </element>
</schema>

现在使用JAXB创建一个名为Doc的类,它将具有一个具有Item的Items类型。因此,我必须添加第一个元素。

Doc doc = new Doc();
Items items = new Items();
items.getItem().add(new Item());
doc.setItems(items);

我希望能够做到以下几点:

Doc doc = new Doc();
doc.getItems().add(new Item());

甚至更好:

Doc doc = new Doc();
doc.addItem(new Item());

无论如何通过JAXB绑定做到这一点?

3 个答案:

答案 0 :(得分:4)

根据comment by nsfyn55,似乎没有办法用绑定做到这一点。

但是,如果你使用JAXB annoations,你可以这样做:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Doc {
    @XmlElementWrapper(name = "items")
    @XmlElement(name="item")
    List<Item> items = new ArrayList<Item>();

    public void addItem(Item item) {
        this.items.add(item);
    }

    // ...
}

答案 1 :(得分:0)

您需要包装标签。它将元素定义为分组序列,而不仅仅是一堆任意元素。

答案 2 :(得分:0)

  

我希望能够做到以下几点:

     

Doc doc = new Doc();

     

doc.getItems()。add(new Item());

我相信你可以(至少在JAXB 2.1中)为getItems()生成的代码检查null成员集合,并在返回之前根据需要创建它。所以它总是返回一个“实时”列表对象。