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
注解在运行时映射中添加类型。