模式定义再表中有三个列是由他们的类型来定义的,但是请注意粗体字部分。模式的规范包括一个微软的具体的命名空间,还有一个来自称之为"IsDataSet"的命名空间的属性设置为真——输入的数据实际上是一个ADO.NET数据集。
所以一个对ADO.NET数据集没有概念的基于java的客户程序需要直接的同数据协作,例如XML。当那不一起排除互操作性同时,这就使得在最后的结果只是一个在三个领域的客户列表的时候,情况更加困难了。
通过首先使用数据集和使用一列自定义类型来替代,Web服务可以具有更加有用和更好的互操作性。下面是一个使用自定义类型创造的Web服务 的WSDL的摘要。
<s:element name="GetCustomers2Response">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetCustomers2Result"
type="tns:ArrayOfCustomer" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfCustomer">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Customer"
type="tns:Customer" />
</s:sequence>
</s:complexType>
<s:complexType name="Customer">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="FirstName"
type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="LastName"
type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="Age"
type="s:int" />
</s:sequence>
</s:complexType>
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetCustomers2Result"
type="tns:ArrayOfCustomer" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfCustomer">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Customer"
type="tns:Customer" />
</s:sequence>
</s:complexType>
<s:complexType name="Customer">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="FirstName"
type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="LastName"
type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="Age"
type="s:int" />
</s:sequence>
</s:complexType>
注意到它把GetCustomers2Result定义为一列复杂类型,该复杂类型具有每个领域的明确定义。现在,即使一个基于java的工具都可以产生一个有用的端口,从而可以允许客户开发者能够更加方便的使用我们的服务。
