以下に、JAXB(JSR-222)とany
例を示します。
ペイロード
プロパティには。のany
注釈が付けられてい@XmlAnyElement(lax=true)
ます。これは、要素がを介してクラスに関連付けられている場合はそのプロパティに対して、そうで@XmlRootElement
ない@XmlElementDecl
場合は対応するオブジェクトのインスタンスを使用してプロパティを設定することを意味しますorg.w3c.dom.Element
。
package forum13941747;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Payload", propOrder = {
"any"
})
public class Payload {
@XmlAnyElement(lax = true)
protected List<Object> any;
}
Foo
以下は、で注釈が付けられたクラスの例です@XmlRootElement
。
package forum13941747;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Foo {
}
バー
@XmlRootElement
以下は、アノテーションのないクラスの例です。このユースケースでは、で注釈が@XmlElementDecl
付けられたファクトリクラス(通常はと呼ばれるObjectFactory
)の注釈を活用し@XmlRegistry
ます。
package forum13941747;
public class Bar {
}
ObjectFactory
以下は、クラスの@XmlElementDecl
アノテーションを指定する例です。Bar
package forum13941747;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
@XmlRegistry
public class ObjectFactory {
@XmlElementDecl(name="bar")
public JAXBElement<Bar> createBar(Bar bar) {
return new JAXBElement<Bar>(new QName("bar"), Bar.class, bar);
}
}
input.xml
以下は、この例で使用する入力ドキュメントです。プロパティに対応する3つの要素がありany
ます。1つ目は、クラスの@XmlRootElement
注釈に対応します。Foo
2番目@XmlElementDecl
はクラスの注釈に対応しBar
、3番目はどのドメインクラスにも対応していません。
<?xml version="1.0" encoding="UTF-8"?>
<payload>
<foo/>
<bar/>
<other/>
</payload>
デモ
以下のデモコードでは、入力ドキュメントのマーシャリングを解除し、結果のany
プロパティでオブジェクトのクラスを出力してから、オブジェクトをマーシャリングしpayload
てXMLに戻します。
package forum13941747;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Payload.class, Foo.class, ObjectFactory.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum13941747/input.xml");
Payload payload = (Payload) unmarshaller.unmarshal(xml);
for(Object o : payload.any) {
System.out.println(o.getClass());
}
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(payload, System.out);
}
}
出力
以下は、デモコードの実行からの出力です。any
プロパティ内のオブジェクトに対応するクラスに注意してください。要素はクラスのfoo
インスタンスになりました。要素は、のインスタンスFoo
を保持するのインスタンスになりました。要素はのインスタンスになりました。bar
JAXBElement
Bar
other
org.w3c.dom.Element
class forum13941747.Foo
class javax.xml.bind.JAXBElement
class com.sun.org.apache.xerces.internal.dom.ElementNSImpl
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<payload>
<foo/>
<bar/>
<other/>
</payload>