如何把xmlns =""作为回应

时间:2014-01-11 14:59:49

标签: soap wsdl

我有这样的回应:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <Response xmlns="http://blahblahblah">
         <SomeResult xmlns="">
            <id>16</id>
            <state>QUEQUE</state>
         </SomeResult>
      </Response>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我想从wsdl:

知道如何做到这一点
<SomeResult xmlns="">

在wsdl中,我有这个:

<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
[...] xlmns:tns="http://blahblahblah" targetNamespace="http://blahblahblah">

<types>
<xsd:schema elementFormDefault="qualified" 
   targetNamespace="http://blahblahblah">

 [...]

 <operation name="TheOperation">
 <soap:operation soapAction="<anOperation>" style="document"/>
 <input><soap:body use="literal" namespace="http://blahblahblah"/></input>
 <output><soap:body use="literal" namespace="http://blahblahblah"/></output>
 </operation>

 [...]

 <xsd:complexType name="TheOperationResponseType">
    <xsd:all>
       <xsd:element name="Response" type="tns:Response" form="unqualified"/>
    </xsd:all>
 </xsd:complexType>

 [...]

 <xsd:complexType name="Response">
   <xsd:all>
       <xsd:element name="id" type="xsd:int"/>
       <xsd:element name="state" type="xsd:string"/>
    </xsd:all>
 </xsd:complexType>

上下文:

老板给了我们wsdl,但有了这个,我只能得到这样的回答:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <Response xmlns="http://blahblahblah">
         <SomeResult>
            <id>16</id>
            <state>QUEQUE</state>
         </SomeResult>
      </Response>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

而且......老板不想改变他的代码以与原始的wsd保持一致。 :(所以我需要知道如何创建一个与其真实答案兼容的WSDL,而不是从原始WSDL中定义的。

解决方案必须与wsdl ...语言无关(因此,我们不能在客户端代码中使用类似Java注释的东西使其与响应兼容......这是我们的第一种方法;)。

1 个答案:

答案 0 :(得分:1)

specification说:

  

默认名称空间声明中的属性值可以为空。   这在声明的范围内具有相同的效果   没有默认的命名空间。

因此,如果您想在响应中获取空的xmlns声明,则需要:

  • 设置默认命名空间

    的xmlns = “your_namespace”

  • 并将SomeResult元素调整为另一个名称空间


在您的WSDL中,您调整了默认命名空间并添加以下设置:

xsd:schema elementFormDefault="qualified"

此设置表示您在架构顶部声明的targetNamespace仅适用于符合架构的XML文档中的元素。但您明确声明了响应元素的不合格选项。

<xsd:element name="Response" type="tns:Response" form="unqualified"/>

在这种情况下,Response元素获取null命名空间。没有此设置,请检查您的肥皂响应消息。