如何在此WSDL中更改名称空间前缀?

时间:2009-12-22 04:48:49

标签: xml soap wsdl namespaces prefix

我正在尝试为预先存在的Web服务创建WSDL。我有一个现有的客户端和现有的服务器,我已经捕获了使用Wireshark的格式。我正在尝试编写一个使用相同格式的新客户端。因此,我试图尽可能地匹配格式,无论是否正确。我正在使用XmlSPY编写一个WSDL文件,我希望它能够转到C#并生成接口代码。

到目前为止,这是我的WSDL:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.ecerami.com/wsdl/HelloService.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ecerami.com/wsdl/HelloService.wsdl" name="HelloService">
 <message name="api:create"/>
 <message name="oanda:create">
  <part name="parameter"/>
  <part name="parameter"/>
 </message>
 <portType name="Oanda_PortType">
  <operation name="create">
   <input message="tns:oanda:create"/>
   <output message="tns:api:create"/>
  </operation>
 </portType>
 <binding name="Oanda_binding" type="tns:Oanda_PortType">
  <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <operation name="create">
   <soap:operation soapAction="sayHello"/>
   <input>
    <soap:body use="encoded"  namespace="oanda.fxtrade.api"/>
   </input>
   <output>
    <soap:body use="encoded" namespace="oanda.fxtrade.api"/>
   </output>
  </operation>
 </binding>
 <service name="Oanda_service">
  <documentation>WSDL File for Oanda FX Trade API (local SOAP server)</documentation>
  <port name="Oanda_port" binding="tns:Oanda_binding">
   <soap:address location="http://10.0.0.3:18081"/>
  </port>
 </service>
</definitions>

以下是我要复制的示例邮件。这就是原始客户端发出的内容:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <oanda:create xmlns:oanda="oanda.fxtrade.api">
      <parameter>FXGAME</parameter>
      <parameter></parameter>
    </oanda:create>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

以下是我的WSDL将为同一消息发出的XmlSPY:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <SOAP-ENV:Body>
      <m:create xmlns:m="oanda.fxtrade.api">
       <parameter/>
       <parameter/>
      </m:create>
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

我现在的问题是 - 如何匹配原始客户端生成的“oanda:”前缀?这是什么叫做命名空间前缀?我生成的代码中的“m:”来自哪里?我可以在本网站的其他示例中找到这方面的内容,但没有一个使用WSDL,至少据我所知。

感谢您提供任何帮助。


当我尝试通过svcutil.exe运行上面的WSDL时,我遇到两个问题。

1)XML格式不正确,因为您不能有多个具有相同名称的参数。 XMLSpy也抱怨这个,所以我现在通过将它们重命名为Parameter1和Parameter2来对它进行处罚。

具体错误是:“指定了多个名为'parameter'的消息部分。每个消息部分必须具有唯一的名称。”

2)一旦过了这个,我就会收到这个错误:

“名称空间前缀'tns:oanda'未定义。”

那么,再次:如何在WSDL文件中更改/添加命名空间定义?

2 个答案:

答案 0 :(得分:4)

名称空间前缀无关紧要。这两个例子在XML规则上是相同的。

答案 1 :(得分:1)

命名空间前缀与变量名称完全相同。您可以使用您希望的任何名称命名命名空间。

这类似于以下java代码:

在第一个XML中:api.fxtrade.onada onada;
在第二个XML中:api.fxtrade.onada m;

换句话说,第一个XML可以理解为:
指的是&#34; oanda.fxtrade.api&#34;变量onada的命名空间,create命名空间中的onada标记,其参数值为FXGAME
第二个XML可以理解为:
指的是&#34; oanda.fxtrade.api&#34;变量m的命名空间,create命名空间中的m标记,将有一个参数...