アノテーション型 XmlAnyElement


  • @RetentionSE(RUNTIMESE)
    @TargetSE({FIELDSE,METHODSE})
    public @interface XmlAnyElement
    JavaBean プロパティを XML 情報セット表現や JAXBElement にマップします。

    このアノテーションは、XML コンテンツを Jakarta XML Binding アノテーション付きクラスのインスタンスに非整列化する際の「キャッチオール」プロパティとして機能します。通常は複数値の JavaBean プロパティにアノテーションを付けますが、単一値の JavaBean プロパティでも発生する可能性があります。アンマーシャリング中に、クラスの他の JavaBean プロパティの静的 @XmlElement または @XmlElementRef アノテーションに一致しない各 xml 要素は、この「キャッチオール」プロパティに追加されます。

    使用箇所:

     @XmlAnyElement
     public ElementSE[] others;
    
     // Collection of ElementSE or JAXBElements.
     @XmlAnyElement(lax="true")
     public ObjectSE[] others;
    
     @XmlAnyElement
     private List<ElementSE> nodes;
    
     @XmlAnyElement
     private ElementSE node;
     

    制限の使用制限

    このアノテーションは、XmlElementXmlAttributeXmlValueXmlElementsXmlIDXmlIDREF と相互に排他的です。

    クラスとそのスーパークラスには、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;
     }
     
    次のようなインスタンスを非整列化できます
    
     <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")
       })
       ListSE<ObjectSE> 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 JAXBElement instance whose value is 1.
      <e:other />  // this will unmarshal to a DOM ElementSE.
      <b>3</b>     // this will unmarshal to a JAXBElement instance whose value is 1.
    </foo>
     

    W3C XML スキーマの「緩い」ワイルドカードエミュレーション

    アノテーションの lax 要素は、"lax" ワイルドカードセマンティクスのエミュレーションを有効にします。例: Java ソースコードに次のようなアノテーションが付けられている場合:
     @XmlRootElement
     class Foo {
       @XmlAnyElement(lax=true)
       public ObjectSE[] 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
    • オプション要素のサマリー

      オプション要素  
      修飾子と型 オプションの要素 説明
      booleanlax
      現在の 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