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 を使用して、Item を持つ Items タイプを持つ Doc というクラスを作成します。したがって、最初の要素を追加するには、これを行う必要があります。

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

代わりに次のことができるようにしたいと思います。

Doc doc = 新しい Doc();

doc.getItems().add(新しいアイテム());

(少なくとも JAXB 2.1 までは) getItems() の生成されたコードは null メンバー コレクションをチェックし、必要に応じてそれを作成してから返すことができると思います。したがって、常に「ライブ」リスト オブジェクトが返されます。

于 2012-04-26T00:01:31.673 に答える
0

ラッパータグが必要です。これは、要素を単なる任意の要素の集まりではなく、グループ化されたシーケンスとして定義するものです。

于 2012-04-25T21:12:16.503 に答える