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 属性的静态 @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 类:
   
    
 &lt;xs:complexType name=&quot;foo&quot;&gt;
   &lt;xs:sequence&gt;
     &lt;xs:element name=&quot;a&quot; type=&quot;xs:int&quot; /&gt;
     &lt;xs:element name=&quot;b&quot; type=&quot;xs:int&quot; /&gt;
     &lt;xs:any namespace=&quot;##other&quot; processContents=&quot;lax&quot; minOccurs=&quot;0&quot; maxOccurs=&quot;unbounded&quot; /&gt;
   &lt;/xs:sequence&gt;
 &lt;/xs:complexType&gt;
 
   
 class Foo {
   int a;
   int b;
   @XmlAnyElement
   List<Element> any;
 }
 
它可以按如下方式解组实例:
   
    
 &lt;foo xmlns:e=&quot;extra&quot;&gt;
   &lt;a&gt;1&lt;/a&gt;
&lt;e:other /&gt;  // this will be bound to DOM, because unmarshalling is orderless
   &lt;b&gt;3&lt;/b&gt;
   &lt;e:other /&gt;
&lt;c&gt;5&lt;/c&gt;     // this will be bound to DOM, because the annotation doesn't remember namespaces.
 &lt;/foo&gt;
 
   
以下模式将生成以下 Java 类:
   
    
 &lt;xs:complexType name=&quot;bar&quot;&gt;
   &lt;xs:complexContent&gt;
   &lt;xs:extension base=&quot;foo&quot;&gt;
     &lt;xs:sequence&gt;
       &lt;xs:element name=&quot;c&quot; type=&quot;xs:int&quot; /&gt;
       &lt;xs:any namespace=&quot;##other&quot; processContents=&quot;lax&quot; minOccurs=&quot;0&quot; maxOccurs=&quot;unbounded&quot; /&gt;
     &lt;/xs:sequence&gt;
   &lt;/xs:extension&gt;
 &lt;/xs:complexType&gt;
 
   
   
    
class Bar extends Foo {
int c;
// Foo.getAny() also represents wildcard content for type definition bar.
 }
 
   
它可以按如下方式解组实例:
   
    
 &lt;bar xmlns:e=&quot;extra&quot;&gt;
   &lt;a&gt;1&lt;/a&gt;
&lt;e:other /&gt;  // this will be bound to DOM, because unmarshalling is orderless
   &lt;b&gt;3&lt;/b&gt;
   &lt;e:other /&gt;
&lt;c&gt;5&lt;/c&gt;     // this now goes to Bar.c
&lt;e:other /&gt;  // this will go to Foo.any
 &lt;/bar&gt;
 
   

XmlElementRefXmlAnyElement 一起使用

XmlAnyElement 注释可与 XmlElementRef 一起使用,用于指派能够参与目录树的其他元素。

以下模式将生成以下 Java 类:

   
    
 &lt;xs:complexType name=&quot;foo&quot;&gt;
   &lt;xs:choice maxOccurs=&quot;unbounded&quot; minOccurs=&quot;0&quot;&gt;
     &lt;xs:element name=&quot;a&quot; type=&quot;xs:int&quot; /&gt;
     &lt;xs:element name=&quot;b&quot; type=&quot;xs:int&quot; /&gt;
     &lt;xs:any namespace=&quot;##other&quot; processContents=&quot;lax&quot; /&gt;
   &lt;/xs:choice&gt;
 &lt;/xs:complexType&gt;
 
   
 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 ) { ... }
 
它可以按如下方式解组实例:
   
    
 &lt;foo xmlns:e=&quot;extra&quot;&gt;
&lt;a&gt;1&lt;/a&gt;     // this will unmarshal to a &lt;A HREF=&quot;../../../../javax/xml/bind/JAXBElement.html&quot; title=&quot;javax.xml.bind 中的类&quot;&gt;&lt;CODE&gt;JAXBElement&lt;/CODE&gt;&lt;/A&gt; instance whose value is 1.
&lt;e:other /&gt;  // this will unmarshal to a DOM &lt;A HREF=&quot;../../../../org/w3c/dom/Element.html&quot; title=&quot;org.w3c.dom 中的接口&quot;&gt;&lt;CODE&gt;Element&lt;/CODE&gt;&lt;/A&gt;.
&lt;b&gt;3&lt;/b&gt;     // this will unmarshal to a &lt;A HREF=&quot;../../../../javax/xml/bind/JAXBElement.html&quot; title=&quot;javax.xml.bind 中的类&quot;&gt;&lt;CODE&gt;JAXBElement&lt;/CODE&gt;&lt;/A&gt; instance whose value is 1.
 &lt;/foo&gt;
 
   

W3C XML 模式 "lax" 通配符仿真

注释的 lax 元素启用了 "lax" 通配符语义的仿真。例如,当按如下方式注释 Java 源代码时:
 @XmlRootElement
 class Foo {
   @XmlAnyElement(lax=true)
   public Object[] others;
 }
 
那么下列文档将按如下方式解组:
   
    
 &lt;foo&gt;
   &lt;unknown /&gt;
   &lt;foo /&gt;
 &lt;/foo&gt;

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 Platform
Standard Ed. 6

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2007 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策