36.2. 使用 XML Schema anyType 类型

概述

XML Schema 类型 xsd:anyType 是所有 XML Schema 类型的根类型。所有原语都是此类的衍生版本,因为所有用户都定义了复杂的类型。因此,定义为 xsd:anyType 都可以以任何 XML Schema 原语以及 schema 文档中定义的任何复杂类型的形式包含数据。

在 Java 中,最匹配的类型是 对象 类。它是所有其他 Java 类的分类为子类型的类。

在 XML Schema 中使用

您可以使用 xsd:anyType 类型,如任何其他 XML Schema 复杂类型。它可以用作 元素类型 元素 的值。它还可用作定义其他类型的基础类型。

例 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 的元素映射到对象 对象例 36.6 “Java 代表 Wild 卡元素” 显示 例 36.5 “使用 Wild Card Element 的复杂类型” 到 Java 类的映射。

例 36.6. Java 代表 Wild 卡元素

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 运行时处理数据的汇总和解压缩到可用 Java 表示中。

marshalling

当 Apache CXF marshals XML 数据编入 Java 类型时,它会尝试 将任何Type 元素整理到已知的 JAXB 对象中。要确定是否可以 将任何Type 元素分到一个 JAXB 生成的对象中,运行时会检查元素的 xsi:type 属性,以确定在元素中构建数据的实际类型。如果 xsi:type 属性不存在,则运行时会尝试按内省来识别元素的实际数据类型。如果元素的实际数据类型决定是应用的 JAXB 上下文已知的类型之一,该元素将被编入正确类型的 JAXB 对象中。

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

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

unmarshalling

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

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