36.2. 使用 XML Schema anyType Type
概述
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” 中描述。