搜索

36.2. 使用 XML Schema anyType Type

download PDF

概述

XML Schema 类型 xsd:anyType 是所有 XML 架构类型的根类型。所有原语都是此类型的衍生性,与所有用户定义复杂类型一样。因此,定义为 xsd:anyType 的元素可以包含任何 XML 架构原语形式的数据,以及架构文档中定义的任何复杂类型。

在 Java 中,最接近的匹配 类型是 对象类。它是所有其他 Java 类是子输入的类。

在 XML 架构中使用

您可以使用 xsd:anyType 类型,作为任何其他 XML 架构复杂类型。它可用作元素的 type 元素 的值。它还可用作定义其他类型的基本类型。

例 36.5 “带有 Wild Card Element 的复杂类型” 显示了一个复杂类型的示例,它包含一个类型为 xsd:anyType 的元素。

例 36.5. 带有 Wild Card Element 的复杂类型

<complexType name="wildStar">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="ship" type="xsd:anyType" />
  </sequence>
</complexType>

映射到 Java

xsd:anyType 类型的元素映射到 Object 对象。例 36.6 “Java 代表 Wild Card Element” 显示 例 36.5 “带有 Wild Card Element 的复杂类型” 到 Java 类的映射。

例 36.6. Java 代表 Wild Card Element

public class WildStar {

    @XmlElement(required = true)
    protected String name;
    @XmlElement(required = true) protected Object ship;

    public String getName() {
        return name;
    }

    public void setName(String value) {
        this.name = value;
    }

    public Object getShip() { return ship; }

    public void setShip(Object value) { this.ship = value; }
}

此映射允许您将任何数据放在代表通配符元素的属性中。Apache CXF 运行时处理数据的 marshaling 和 unmarshaling,以可用的 Java 表示。

Marshalling

当 Apache CXF XML 数据放入 Java 类型时,它会尝试 将任何Type 元素放入已知的 JAXB 对象中。要确定是否可以将 anyType 元素放入一个 JAXB 生成的对象中,运行时会检查元素的 xsi:type 属性,以确定在元素中构建数据的实际类型。如果没有 xsi:type 属性,则运行时会尝试通过内省来识别元素的实际数据类型。如果元素的实际数据类型确定是应用的 JAXB 上下文已知的类型之一,则元素将放入正确类型的 JAXB 对象中。

如果运行时无法确定元素的实际数据类型,或者元素的实际数据类型不是已知类型,则运行时会将内容放入 org.w3c.dom.Element 对象中。然后,您需要使用 DOM APis 处理元素的内容。

应用的运行时通常知道其合同中包含的模式内的所有类型。这包括合同的 wsdl:types 元素中定义的类型,通过包含添加到合同的任何数据类型,以及通过导入其他模式文档添加到合同中的任何类型的。您还可以使用 @XmlSeeAlso 注释,使运行时了解额外的类型,该注释在 第 32.4 节 “将类添加到 Runtime Marshaller” 中进行了描述。

unmarshalling

当 Apache CXF unmarshals Java 类型进入 XML 数据时,它使用 Java 数据类型和所代表的 XML 架构之间的内部映射,以确定要写入有线的 XML 结构。如果运行时知道类,并且可以将类映射到 XML 架构结构,它会写出数据并插入 xsi:type 属性来识别元素包含的数据类型。如果数据存储在 org.w3c.dom.Element 对象中,则运行时会写入对象代表的 XML 结构,但它不包括 xsi:type 属性。

如果运行时无法将 Java 对象映射到已知的 XML 架构结构,它会抛出 marshaling 异常。您可以使用 @XmlSeeAlso 注释,将类型添加到运行时的映射中,该注释在 第 32.4 节 “将类添加到 Runtime Marshaller” 中描述。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.