使用架构扩展时更改元素的出现顺序

时间:2014-02-11 19:29:30

标签: xml xsd schema

我在调用外部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中做些什么更改才能成功验证实际响应(如上所述)?

1 个答案:

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

因此,您可以尝试告诉服务提供商您做错了。否则你估计有点卡住了。抱歉,想不出合适的解决方法。