2014-02-11 100 views
2

我在調用外部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中做什麼改變來成功驗證實際響應(如上所述)?

回答

0

不幸的是,您的服務提供商的XML服務響應不符合他們自己的服務定義!

從W3C:http://www.w3.org/TR/xmlschema-0/#DerivExt

當一個複雜類型是由擴展衍生,其有效含量 模式在類型派生指定的基類型的內容模型加的內容模型

它繼續用一個例子:

<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> 

所以你可以嘗試告訴服務提供商你做錯了。否則,我覺得你有點卡住了。對不起,不能想到一個合適的解決方法。