我在調用外部Web服務時遇到了XSD擴展的這個問題。他們的WSDL定義輸出到這樣的事情,在使用Schema擴展時更改元素的出現順序
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>
我的Web服務客戶端拋出一個驗證錯誤說「期望‘ExcngStatus’元素,而是收到‘帳戶名’元素。
我讀到關於使用擴展XML架構和每文件說,通過使用,額外的元素將被添加到baseType中提到的 的baseType中,意味着baseType將被額外的元素擴展。
我的問題是 與WSDL結構(上面給出),是否有任何錯誤的預期響應(上面給出)? 在使用擴展名 ''時,是否可以指定元素的出現順序? 我可以在WSDL中做什麼改變來成功驗證實際響應(如上所述)?