JavaTM 2 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 屬性的靜態 @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;
 

限制用法約束

此註釋與 XmlElementXmlAttributeXmlValueXmlElementsXmlIDXmlIDREF 互斥。

在類別及其父級類別中只能有一個 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>
 

XmlElementRefXmlAnyElement 一起使用

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 網要 "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 中的已知元素時控制解組行為。
 Class<? extends DomHandler> value
          指定 DomHandler,它負責實際執行 XML 與類別 DOM 資料結構之間的轉換。
 

lax

public abstract boolean lax
在查看當前 JAXBContext 中的已知元素時控制解組行為。

當為 false 時

如果為 false,則所有與該屬性比對的元素都將被解組為 DOM,並且該屬性將只包含 DOM 元素。

當為 true 時

如果為 true,則當某一元素與使用 JAXBContext 已知的 XmlAnyElement 標記的屬性比對時(例如,存在具有相同標記名稱的帶有 XmlRootElement 的類別,或者存在具有相同標記名稱的 XmlElementDecl),unmarshaller 會立即將此元素解組到 JAXB 物件,而不是解組到 DOM。此外,如果元素是未知的,但它有一個已知的 xsi:type,則通過使用未知的元素名稱和設置為已知 xsi:type 的 JAXB 映射實例的 JAXBElement 值,unmarshaller 可立即將此元素解組到 JAXBElement

因此,在解組之後,屬性可能變得完全不同,它可能在包含 DOM 節點的同時還包含一些 JAXB 物件。

可以使用這種特性來仿真 W3C XML 網要的 "lax" 通配符語義。

預設值:
false

value

public abstract Class<? extends DomHandler> value
指定 DomHandler,它負責實際執行 XML 與類別 DOM 資料結構之間的轉換。

預設值:
javax.xml.bind.annotation.W3CDomHandler.class

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only