第 36 章 使用 Wild 卡类型


摘要

当模式作者希望将元素或属性延迟到定义的类型时,会有一些实例。对于这些情况,XML Schema 提供三种机制来指定通配符位置持有者。它们都以保留其 XML 架构功能的方式映射到 Java。

36.1. 使用任何元素

概述

XML 架构 任何 元素用于在复杂类型定义中创建通配符位置拥有者。当 XML 元素实例化 XML 元素时,它可以是任何有效的 XML 元素。任何 元素不会对内容或实例化 XML 元素的名称施加任何限制。

例如,如果 例 36.1 “使用任何元素定义的 XML 架构类型” 中定义的复杂类型,您可以实例化 例 36.2 “带有任何元素的 XML 文档” 中显示的任一 XML 元素。

例 36.1. 使用任何元素定义的 XML 架构类型

<element name="FlyBoy">
  <complexType>
    <sequence>
      <any />
      <element name="rank" type="xsd:int" />
    </sequence>
  </complexType>
</element>
Copy to Clipboard Toggle word wrap

例 36.2. 带有任何元素的 XML 文档

<FlyBoy>
  <learJet>CL-215</learJet>
  <rank>2</rank>
</element>
<FlyBoy>
  <viper>Mark II</viper>
  <rank>1</rank>
</element>
Copy to Clipboard Toggle word wrap

XML 架构 任何 元素映射到 Java 对象对象或 Java org.w3c.dom.Element 对象。

在 XML 架构中指定

在定义序列复杂类型和选择复杂类型时,可以使用任何 元素。在大多数情况下,任何 元素都是空元素。但是,它可以取一个 annotation 元素作为子元素。

表 36.1 “XML 架构任何元素的属性” 描述 任何 元素的属性。

Expand
表 36.1. XML 架构任何元素的属性
属性描述

namespace

指定可用于实例化 XML 文档中的元素元素的命名空间。有效值为:

RENTT
指定可以使用任何命名空间中的元素。这是默认值。
##other
指定可以使用 parent 元素命名空间以外的任何命名空间中 的元素。
##local
必须使用没有命名空间的元素。
##targetNamespace
指定必须使用 parent 元素命名空间中的元素。
一个以空格分隔的 URI 列表: \#local\#\#targetNamespace
指定可以使用任何列出的命名空间中的元素。

maxOccurs

指定元素实例在 parent 元素中的最大次数。默认值为 1。要指定元素的实例可能会显示无限次数,您可以将属性的值设置为 未绑定

minOccurs

指定元素实例在 parent 元素中可以包括的最小次数。默认值为 1

processContents

指定用于实例化任何元素的元素应如何进行验证。有效值为:

strict
指定必须针对正确的模式验证元素。这是默认值。
lax
指定该元素应根据正确的架构进行验证。如果无法验证,则不会抛出错误。
skip
指定不应验证元素。

例 36.3 “使用任何元素定义的复杂类型” 显示 使用任意 元素定义的复杂类型

例 36.3. 使用任何元素定义的复杂类型

<complexType name="surprisePackage">
  <sequence>
    <any processContents="lax" />
    <element name="to" type="xsd:string" />
    <element name="from" type="xsd:string" />
  </sequence>
</complexType>
Copy to Clipboard Toggle word wrap

映射到 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 类

public class SurprisePackage {

    @XmlAnyElement(lax = true) protected Object any;
    @XmlElement(required = true)
    protected String to;
    @XmlElement(required = true)
    protected String from;

    public Object getAny() { return any; }

    public void setAny(Object value) { this.any = value; }

    public String getTo() {
        return to;
    }

    public void setTo(String value) {
        this.to = value;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String value) {
        this.from = value;
    }

}
Copy to Clipboard Toggle word wrap

Marshalling

如果任何 元素的 Java 属性将其 lax 设为 false,或者未指定属性,则运行时不会尝试将 XML 数据解析到 JAXB 对象中。数据始终存储在 DOM Element 对象中。

如果任何 元素的 Java 属性将其 lax 设为 true,则运行时会尝试将 XML 数据放入适当的 JAXB 对象中。运行时会尝试按照以下流程识别正确的 JAXB 类:

  1. 它根据运行时已知的元素列表检查 XML 元素的元素标签。如果找到匹配项,则运行时会将 XML 数据放入该元素的正确 JAXB 类中。
  2. 它检查 XML 元素的 xsi:type 属性。如果找到匹配项,则运行时会将 XML 元素放入该类型的正确的 JAXB 类中。
  3. 如果找不到匹配,则将 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” 中描述。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat