アノテーション型 XmlAnyElement
@RetentionSE(RUNTIMESE) @TargetSE({FIELDSE,METHODSE}) public @interface XmlAnyElement
JavaBean プロパティを XML 情報セット表現や JAXBElement にマップします。このアノテーションは、XML コンテンツを Jakarta XML Binding アノテーション付きクラスのインスタンスに非整列化する際の「キャッチオール」プロパティとして機能します。通常は複数値の JavaBean プロパティにアノテーションを付けますが、単一値の JavaBean プロパティでも発生する可能性があります。アンマーシャリング中に、クラスの他の JavaBean プロパティの静的 @XmlElement または @XmlElementRef アノテーションに一致しない各 xml 要素は、この「キャッチオール」プロパティに追加されます。
使用箇所:
@XmlAnyElement public
Element
SE[] others; // Collection ofElement
SE or JAXBElements. @XmlAnyElement(lax="true") publicObject
SE[] others; @XmlAnyElement private List<Element
SE> nodes; @XmlAnyElement privateElement
SE node;制限の使用制限
このアノテーションは、
XmlElement
、XmlAttribute
、XmlValue
、XmlElements
、XmlID
、XmlIDREF
と相互に排他的です。クラスとそのスーパークラスには、1 つの
XmlAnyElement
アノテーション付き JavaBean プロパティしか存在できません。他のアノテーションとの関連
このアノテーションは
XmlJavaTypeAdapter
とともに使用できるため、ユーザーは独自のデータ構造を DOM にマップし、DOM を XML に構成することができます。このアノテーションは、次のように
XmlMixed
で使用できます。// List of java.lang.String or DOM nodes. @XmlAnyElement @XmlMixed List<Object> others;
スキーマから Java への例
次のスキーマは、次の Java クラスを生成します。<xs:complexType name="foo"> <xs:sequence> <xs:element name="a" type="xs:int" /> <xs:element name="b" type="xs:int" /> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType>
class Foo { int a; int b; @
次のようなインスタンスを非整列化できますXmlAnyElement
List<Element> any; }
次のスキーマは、次の Java クラスを生成します。<foo xmlns:e="extra"> <a>1</a> <e:other /> // this will be bound to DOM, because unmarshalling is orderless <b>3</b> <e:other /> <c>5</c> // this will be bound to DOM, because the annotation doesn't remember namespaces. </foo>
<xs:complexType name="bar"> <xs:complexContent> <xs:extension base="foo"> <xs:sequence> <xs:element name="c" type="xs:int" /> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:extension> </xs:complexType>
class Bar extends Foo { int c; // Foo.getAny() also represents wildcard content for type definition bar. }
次のようなインスタンスを非整列化できます<bar xmlns:e="extra"> <a>1</a> <e:other /> // this will be bound to DOM, because unmarshalling is orderless <b>3</b> <e:other /> <c>5</c> // this now goes to Bar.c <e:other /> // this will go to Foo.any </bar>
XmlAnyElement
とXmlElementRef
の併用XmlAnyElement
アノテーションをXmlElementRef
とともに使用して、コンテンツツリーに参加できる追加の要素を指定できます。次のスキーマは、次の Java クラスを生成します。
<xs:complexType name="foo"> <xs:choice maxOccurs="unbounded" minOccurs="0"> <xs:element name="a" type="xs:int" /> <xs:element name="b" type="xs:int" /> <xs:any namespace="##other" processContents="lax" /> </xs:choice> </xs:complexType>
class Foo { @
次のようなインスタンスを非整列化できますXmlAnyElement
(lax="true") @XmlElementRefs
({ @XmlElementRef
(name="a", type="JAXBElement.class") @XmlElementRef
(name="b", type="JAXBElement.class") })List
SE<Object
SE> others; } @XmlRegistry class ObjectFactory { ... @XmlElementDecl(name = "a", namespace = "", scope = Foo.class)JAXBElement
<Integer> createFooA( Integer i ) { ... } @XmlElementDecl(name = "b", namespace = "", scope = Foo.class)JAXBElement
<Integer> createFooB( Integer i ) { ... }<foo xmlns:e="extra">
<a>1</a>
// this will unmarshal to aJAXBElement
instance whose value is 1.<e:other />
// this will unmarshal to a DOMElement
SE.<b>3</b>
// this will unmarshal to aJAXBElement
instance whose value is 1.</foo>
W3C XML スキーマの「緩い」ワイルドカードエミュレーション
アノテーションの lax 要素は、"lax" ワイルドカードセマンティクスのエミュレーションを有効にします。例: Java ソースコードに次のようなアノテーションが付けられている場合:@
次に、次のドキュメントは次のように非整列化します。XmlRootElement
class Foo { @XmlAnyElement(lax=true) publicObject
SE[] others; }<foo> <unknown /> <foo /> </foo> Foo foo = unmarshal(); // 1 for 'unknown', another for 'foo' assert foo.others.length==2; // 'unknown' unmarshals to a DOM element assert foo.others[0] instanceof Element; // because of lax=true, the 'foo' element eagerly // unmarshals to a Foo object. assert foo.others[1] instanceof Foo;
- 導入:
- 1.6、JAXB 2.0
- 作成者:
- Kohsuke Kawaguchi
オプション要素のサマリー
オプション要素 修飾子と型 オプションの要素 説明 boolean
lax
現在のJAXBContext
が認識している要素を検出したときのアンマーシャラーの動作を制御します。ClassSE<? extends DomHandler<?,?>>
value
XML から DOM のようなデータ構造への変換を実際に行うDomHandler
を指定します。
要素の詳細
lax
boolean lax
現在のJAXBContext
が認識している要素を検出したときのアンマーシャラーの動作を制御します。- 偽の場合
- false の場合、プロパティに一致するすべての要素が DOM に非整列化され、プロパティには DOM 要素のみが含まれます。
- 真のとき
- true の場合、
XmlAnyElement
でマークされたプロパティに一致する要素がJAXBContext
が認識している場合(たとえば、同じタグ名を持つXmlRootElement
のクラスがある場合、または同じタグ名を持つXmlElementDecl
がある場合)、アンマーシャラーは DOM にアンマーシャルする代わりに、この要素を Jakarta XML Binding オブジェクトに先行してアンマーシャルするようにします。さらに、要素が不明であるが既知の xsi:type を持つ場合、アンマーシャラーはその要素を未知の要素名を持つJAXBElement
、JAXBElement 値は既知の xsi:type の Jakarta XML Binding マッピングのインスタンスにアンマーシャルします。
その結果、アンマーシャリング後にプロパティが不均一になる可能性があります。DOM ノードといくつかの Jakarta XML Binding オブジェクトを同時に持つことができます。
これは、W3C XML スキーマの「緩い」ワイルドカードセマンティクスをエミュレートするために使用できます。
- デフォルト:
- false
value
ClassSE<? extends DomHandler<?,?>> value
XML から DOM のようなデータ構造への変換を実際に行うDomHandler
を指定します。- デフォルト:
- jakarta.xml.bind.annotation.W3CDomHandler.class