1

我想要以下 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 的类,该类将具有一个 Items 类型,该类型具有一个 Item。因此,要添加第一个元素,我必须这样做。

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 绑定来做到这一点?

4

3 回答 3

4

根据nsfyn55的评论,似乎没有任何方法可以使用绑定来做到这一点。

但是,如果您使用 JAXB 注释,您可以这样做:

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

    // ...
}
于 2012-04-25T21:16:50.310 回答
0

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

于 2012-04-25T21:12:16.503 回答
0

我希望能够执行以下操作:

文档文档 = 新文档();

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

我相信您可以(至少到 JAXB 2.1)生成的 getItems() 代码将检查空成员集合,并在必要时在返回之前创建它。所以它总是返回一个“活动”列表对象。

于 2012-04-26T00:01:31.673 回答