第 36 章 使用 Wild 卡类型
摘要
当模式作者希望将元素或属性延迟到定义的类型时,会有一些实例。对于这些情况,XML Schema 提供三种机制来指定通配符位置持有者。它们都以保留其 XML 架构功能的方式映射到 Java。
36.1. 使用任何元素 复制链接链接已复制到粘贴板!
概述 复制链接链接已复制到粘贴板!
XML 架构 任何
元素用于在复杂类型定义中创建通配符位置拥有者。当 XML 元素实例化 XML 元素时,它可以是任何有效的 XML 元素。任何
元素不会对内容或实例化 XML 元素的名称施加任何限制。
例如,如果 例 36.1 “使用任何元素定义的 XML 架构类型” 中定义的复杂类型,您可以实例化 例 36.2 “带有任何元素的 XML 文档” 中显示的任一 XML 元素。
例 36.1. 使用任何元素定义的 XML 架构类型
例 36.2. 带有任何元素的 XML 文档
XML 架构 任何
元素映射到 Java 对象对象或 Java org.w3c.dom.Element
对象。
在 XML 架构中指定 复制链接链接已复制到粘贴板!
在定义序列复杂类型和选择复杂类型时,可以使用任何
元素。在大多数情况下,任何
元素都是空元素。但是,它可以取一个 annotation
元素作为子元素。
表 36.1 “XML 架构任何元素的属性” 描述 任何
元素的属性。
属性 | 描述 |
---|---|
| 指定可用于实例化 XML 文档中的元素元素的命名空间。有效值为:
|
|
指定元素实例在 parent 元素中的最大次数。默认值为 |
|
指定元素实例在 parent 元素中可以包括的最小次数。默认值为 |
| 指定用于实例化任何元素的元素应如何进行验证。有效值为:
|
例 36.3 “使用任何元素定义的复杂类型” 显示 使用任意
元素定义的复杂类型
例 36.3. 使用任何元素定义的复杂类型
映射到 Java 复制链接链接已复制到粘贴板!
XML 架构 任何
元素会导致创建名为 任何
的 Java 属性。属性具有关联的 getter 和 setter 方法。生成的属性的类型取决于元素的 processContents
属性的值。如果将 任何
元素的 processContents
属性设置为 skip
,则元素将映射到 org.w3c.dom.Element
对象。对于任何元素的 processContents
属性的所有其他值,任何
元素映射到 Java 对象对象。
生成的属性使用 @XmlAnyElement
注释进行解码。此注解有一个可选的 lax
属性,它指示在处理数据时运行时要做什么。其默认值为 false
,它指示运行时自动将数据放入 org.w3c.dom.Element
对象。将 lax
设置为 true
会指示运行时尝试将数据放入 JAXB 类型。当任何
元素的 processContents
属性设置为 skip
时,lax
属性将设为默认值。对于 processContents
属性的所有其他值,lax
被设置为 true
。
例 36.4 “带有任何元素的 Java 类” 显示 例 36.3 “使用任何元素定义的复杂类型” 中定义的复杂类型如何映射到 Java 类。
例 36.4. 带有任何元素的 Java 类
Marshalling 复制链接链接已复制到粘贴板!
如果任何
元素的 Java 属性将其 lax
设为 false
,或者未指定属性,则运行时不会尝试将 XML 数据解析到 JAXB 对象中。数据始终存储在 DOM Element
对象中。
如果任何
元素的 Java 属性将其 lax
设为 true
,则运行时会尝试将 XML 数据放入适当的 JAXB 对象中。运行时会尝试按照以下流程识别正确的 JAXB 类:
- 它根据运行时已知的元素列表检查 XML 元素的元素标签。如果找到匹配项,则运行时会将 XML 数据放入该元素的正确 JAXB 类中。
-
它检查 XML 元素的
xsi:type
属性。如果找到匹配项,则运行时会将 XML 元素放入该类型的正确的 JAXB 类中。 -
如果找不到匹配,则将 XML 数据放入 DOM
Element
对象中。
通常,应用程序的运行时知道从架构在其合同中包含的所有类型。这包括合同的 wsdl:types
元素中定义的类型,通过包含添加到合同的任何数据类型,以及通过导入其他模式添加到合同中的任何类型的。您还可以使用 @XmlSeeAlso
注释,使运行时了解额外的类型,该注释在 第 32.4 节 “将类添加到 Runtime Marshaller” 中进行了描述。
unmarshalling 复制链接链接已复制到粘贴板!
如果任何
元素的 Java 属性将其 lax
设为 false
,或者未指定属性,则运行时将仅接受 DOM Element
对象。尝试使用任何其他类型的对象将导致 marshalling 错误。
如果任何
元素的 Java 属性将其 lax
设为 true
,则运行时会使用其 Java 数据类型和 XML 架构之间的内部映射,以确定要写入有线的 XML 结构。如果运行时知道类并将其映射到 XML 架构结构,它会写出数据并插入 xsi:type
属性来识别元素包含的数据类型。
如果运行时无法将 Java 对象映射到已知的 XML 架构结构,它将抛出 marshaling 异常。您可以使用 @XmlSeeAlso
注释,将类型添加到运行时的映射中,该注释在 第 32.4 节 “将类添加到 Runtime Marshaller” 中描述。