xsd:any 是一个用于设计 XML 模式的流行特性。但它所带来的麻烦常常比它所带来的价值还要多。了解 xsd:any 在 XML 本身中和 JAX-RPC Java 语言绑定中的一些不足之处后,即使您决定使用 xsd:any,也能为更好地使用它做好准备。
引言
人们为什么喜欢使用 xsd:any 呢?我听人们谈起过很多原因:为了实现松散耦合、为了启用版本管理、为了获得完全灵活的多态性。而所有这些理由最终都归结为不需对 API 进行更改。这是一个很不错的理由,但在实践中,使用 xsd:any 既不恰当,也不实际。如果所处的是动态环境,仅处理 XML,则 xsd:any 可能非常合适(也的确如此)。但大多数人并不喜欢动态访问 XML(即 SAX 或 DOM 或 SAAJ 编程模型)的复杂性,而且,即使他们喜欢这种复杂性,动态性也会受到局限。而 XML 很少存在于“真空环境”中。XML 几乎总是映射到别的对象或与其他对象进行交互。例如,XML 模式可能作为 Web 服务的一部分而存在,而这意味着将可能处理语言绑定问题。因此,应当对语言绑定将 xsd:any 映射到给定语言的方式加以注意。在本文中,我将重点讨论 JAX-RPC Java™ 语言绑定。
使用 xsd:any 的 Web 服务示例
让我们看一下清单 1 中的 WSDL 文件示例。这是一个简单的宠物医院 Web 服务。它定义了一个名为 registerPet 的操作,其输入信息包含一个 xsd:any。此 WSDL 还定义了两个宠物类型:cat 和 fish。
清单 1. 使用 xsd:any 的兽医服务 WSDL
<?xml version="1.0" encoding="UTF-8"?>
<definitions
targetNamespace="urn:any"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="urn:any"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema
targetNamespace="urn:any"
xmlns:tns="urn:any"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="Cat">
<sequence>
<element name="name" type="xsd:string"/>
<element name="breed" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="Fish">
<sequence>
<element name="name" type="xsd:string"/>
<element name="saltWater" type="xsd:boolean"/>
</sequence>
</complexType>
<element name="registerPet">
<complexType>
<sequence>
<any namespace="##any"/>
</sequence>
</complexType>
</element>
<element name="registerPetResponse">
<complexType>
<sequence/>
</complexType>
</element>
</schema>
</types>
<message name="registerPetRequest">
<part name="registerPetRequest" element="tns:registerPet"/>
</message>
文章来源于领测软件测试网 https://www.ltesting.net/