我在调用外部Web服务时遇到了XSD扩展的问题。他们的WSDL将输出定义为类似的东西,
WSDL结构
<wsdl:message name="customerHistoryInquiryResponse">
<wsdl:part name="customerHistoryInquiryReturn" type="impl:customerHistoryResult"/>
</wsdl:message>
<complexType name="customerHistoryResult">
<complexContent>
<extension base="impl:ServiceRequestResult">
<sequence>
<element name="accountName" nillable="true" type="xsd:string"/>
<element name="accountNumber" nillable="true" type="xsd:string"/>
<element name="application" nillable="true" type="xsd:string"/>
<element name="paymentRecords" nillable="true" type="impl:ArrayOfPaymentSummary"/>
<element name="premiseAddress" nillable="true" type="impl:Address"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType abstract="true" name="ServiceRequestResult">
<sequence>
<element name="excngStatus" nillable="true" type="impl:ExcngStatus"/>
</sequence>
</complexType>
<complexType name="ExcngStatus">
<sequence>
<element name="statusCode" nillable="true" type="xsd:string"/>
<element name="statusMessage" nillable="true" type="xsd:string"/>
<element name="exchangeDateTime" nillable="true" type="xsd:string"/>
<element name="exchangeId" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
因此,使用WSDL中的上述响应结构,我的Web服务客户端工具正在以这种方式期待XML响应,
预期回应
<customerHistoryInquiryResponse>
<customerHistoryInquiryReturn>
<ExcngStatus>
..
..
..
</ExcngStatus>
<accountName/>
<accountNumber/>
<application/>
<paymentRecords>
..
..
..
</paymentRecords>
<premiseAddress>
..
..
..
</premiseAddress>
</customerHistoryInquiryReturn>
</customerHistoryInquiryResponse>
但是当我进行Web服务调用时,服务的实际响应不遵循自己的WSDL结构。服务响应结构如下所示,元素出现在结构的末尾而不是位于顶部。
实际应对
<customerHistoryInquiryResponse>
<customerHistoryInquiryReturn>
<accountName/>
<accountNumber/>
<application/>
<paymentRecords>
..
..
..
</paymentRecords>
<premiseAddress>
..
..
..
</premiseAddress>
<ExcngStatus>
..
..
..
</ExcngStatus>
</customerHistoryInquiryReturn>
</customerHistoryInquiryResponse>
我的网络服务客户端抛出验证错误,说“预期的'ExcngStatus'元素,而是收到'accountName'元素。
我读到了有关使用扩展XML Schema的内容,并且每个文档都说通过使用,其他元素将被添加到baseType,即 在base =“”中提到,表示baseType将使用其他元素进行扩展。
我的问题是/是, 使用WSDL结构(如上所述),EXPECTED RESPONSE中是否有任何错误(如上所述)? 有没有办法在使用扩展时指定元素的出现顺序 ''? 我可以在WSDL中做些什么更改才能成功验证实际响应(如上所述)?
答案 0 :(得分:0)
不幸的是,您的服务提供商xml服务响应不符合他们自己的服务定义!
来自w3c:http://www.w3.org/TR/xmlschema-0/#DerivExt
当复杂类型通过扩展派生时,其有效内容 model是基类型和内容模型的内容模型 在类型派生中指定
继续举例:
<complexType name="Address">
<sequence>
<element name="name" type="string"/>
<element name="street" type="string"/>
<element name="city" type="string"/>
</sequence>
</complexType>
<complexType name="UKAddress">
<complexContent>
<extension base="ipo:Address">
<sequence>
<element name="postcode" type="ipo:UKPostcode"/>
</sequence>
....
</extension>
</complexContent>
</complexType>
这相当于:
<complexType name="UKAddress">
<sequence>
<!-- content model of Address -->
<element name="name" type="string"/>
<element name="street" type="string"/>
<element name="city" type="string"/>
<!-- appended element declaration -->
<element name="postcode" type="ipo:UKPostcode"/>
</sequence>
....
</complexType>
因此,您可以尝试告诉服务提供商您做错了。否则你估计有点卡住了。抱歉,想不出合适的解决方法。