4

JAXB を使用して次の XML をシリアライズおよびデシリアライズするにはどうすれcomplement1ばよいですか?23complement45n

アノテーションを使用することを考えまし@XmlAnyElementたが、値「First」は最初の補数に属し、「Second」は 2 番目に属するなどを知る必要があります。

<resource>
    <id>Identifier</id>
    <name>Name</name>
    <complement1>First</complement1>
    <complement2>Second</complement2>
    <complement3>Third</complement3>
</resource>
4

1 に答える 1

6

@XmlAnyElement を使用できると思いますが、要素名にアクセスできます。
「List of any」コンストラクトを使用する必要があります。
JAXB が XML をアンマーシャリングすると、DOM Element オブジェクトのリストが得られます。各オブジェクトには、要素名とコンテンツが含まれています。
各要素のタグ名が「complementN」パターンに一致するように手動で強制する必要があると思います。

たとえば、これは Oracle サンプルの 1 つを変更したものです。

スキーマ:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
      <xs:sequence>
          <xs:any minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:sequence>
  </xs:complexType>
</xs:element> 

xjc で生成された Person クラスのスニペット:

...
@XmlRootElement(name = "person")
public class Person {

    @XmlElement(required = true)
    protected String firstname;
    @XmlElement(required = true)
    protected String lastname;
    @XmlAnyElement(lax = true)
    protected List<Object> any;
...

テスト XML ファイル:

<?xml version="1.0" encoding="utf-8"?>
<person>
  <firstname>David</firstname>
  <lastname>Francis</lastname>
  <anyItem1>anyItem1Value</anyItem1>
  <anyItem2>anyItem2Value</anyItem2>
</person>

テストクラス:

JAXBContext jc = JAXBContext.newInstance( "generated" );
Unmarshaller u = jc.createUnmarshaller();
Person contents = (Person) u.unmarshal(Testit.class.getResource("./anysample_test1.xml"));
System.out.println("contents: " + contents);
System.out.println("  firstname: " + contents.getFirstname());
System.out.println("  lastname: " + contents.getLastname());
System.out.println("  any: ");
for (Object anyItem : contents.getAny()) {
    System.out.println("    any item: " + anyItem);
    Element ele = (Element) anyItem;
    System.out.println("      ele name: " + ele.getTagName());
    System.out.println("      ele text content: " + ele.getTextContent());
}

出力:

contents: generated.Person@1bfc93a
  firstname: David
  lastname: Francis
  any: 
    any item: [anyItem1: null]
      ele name: anyItem1
      ele text content: anyItem1Value
    any item: [anyItem2: null]
      ele name: anyItem2
      ele text content: anyItem2Value
于 2012-05-17T15:03:24.477 に答える