JavaTM Platform
Standard Ed. 6

javax.xml.bind.annotation
注釈型 XmlAnyElement


@Retention(value=RUNTIME)
@Target(value={FIELD,METHOD})
public @interface XmlAnyElement

JavaBean プロパティーを、XML 情報セット表現または JAXB 要素、あるいはその両方にマップします。

XML コンテンツを JAXB 注釈を付けられたクラスのインスタンスに非整列化する処理の実行中、この注釈は、「catch-all (すべてをキャッチする)」プロパティーとして働きます。通常、複数値を持つ JavaBean プロパティーを注釈しますが、単一値を持つ JavaBean プロパティーで使用されることもあります。非整列化の実行中、クラスのその他の JavaBean プロパティーの static @XmlElement または @XmlElementRef 注釈に一致しない各 XML 要素は、この「catch-all」プロパティーに追加されます。

使用法:

 @XmlAnyElement
 public Element[] others;
 
 // Collection of Element or JAXB elements.
 @XmlAnyElement(lax="true")
 public Object[] others;

 @XmlAnyElement
 private List<Element> nodes;

 @XmlAnyElement
 private Element node;
 

制限使用制約

この注釈は、XmlElementXmlAttributeXmlValueXmlElementsXmlID、および XmlIDREF と相互に排他的です。

あるクラスとそれのスーパークラスで、XmlAnyElement で注釈された JavaBean プロパティーは 1 つだけです。

ほかの注釈との関係

この注釈は XmlJavaTypeAdapter とともに使用できるため、ユーザーは自分のデータ構造を 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;
 }
 
次のようなインスタンスを非整列化できます。

 <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>
 
次のスキーマは、次の Java クラスを生成します。

 <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>
 

XmlAnyElementXmlElementRef の使用

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<Object> 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 a <A HREF="../../../../javax/xml/bind/JAXBElement.html" title="javax.xml.bind 内のクラス"><CODE>JAXBElement</CODE></A> instance whose value is 1.
   <e:other />  // this will unmarshal to a DOM <A HREF="../../../../org/w3c/dom/Element.html" title="org.w3c.dom 内のインタフェース"><CODE>Element</CODE></A>.
   <b>3</b>     // this will unmarshal to a <A HREF="../../../../javax/xml/bind/JAXBElement.html" title="javax.xml.bind 内のクラス"><CODE>JAXBElement</CODE></A> instance whose value is 1.
 </foo>
 

W3C XML Schema「lax」ワイルドカードエミュレーション

この注釈の lax 要素は、「lax」ワイルドカードセマンティクスのエミュレーションを可能にします。たとえば、Java ソースコードが次のように注釈された場合を考えます。
 @XmlRootElement
 class Foo {
   @XmlAnyElement(lax=true)
   public Object[] 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;
 

導入されたバージョン:
JAXB2.0

任意要素の概要
 boolean lax
          現在の JAXBContext で既知の要素に出会った場合、unmarshaller の動作を制御します。
 Class<? extends DomHandler> value
          XML と DOM 式データ構造の間の変換を実際に行う、DomHandler を指定します。
 

lax

public abstract boolean lax
現在の JAXBContext で既知の要素に出会った場合、unmarshaller の動作を制御します。

false の場合

false の場合、プロパティーに一致するすべての要素が DOM に非整列化され、プロパティーには DOM 要素のみが含まれます。

true の場合

true の場合、要素が XmlAnyElement でマークされているプロパティーに一致し、JAXBContext に知られている場合 (たとえば、同じタグ名を持つ XmlRootElement を伴うクラスが存在する場合や、同じタグ名を持つ XmlElementDecl が存在する場合)、unmarshaller はこの要素を DOM に非整列化する代わりに、それを JAXB オブジェクトに非整列化しようとします。また、要素は不明であるがそれが既知の xsi:type を持つ場合、unmarshaller はその要素を JAXBElement に非整列化しようとします。これは不明な要素名を持ち、value は既知の xsi:type の JAXB マッピングのインスタンスに設定されます。

結果として、非整列化後、プロパティーは異種的なものとなり、DOM ノードと JAXB オブジェクトを同時に持つ可能性があります。

これを使用すると、W3C XML Schema の「lax」ワイルドカードセマンティクスをエミュレートできます。

デフォルト:
false

value

public abstract Class<? extends DomHandler> value
XML と DOM 式データ構造の間の変換を実際に行う、DomHandler を指定します。

デフォルト:
javax.xml.bind.annotation.W3CDomHandler.class

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。