gSOAP和一般SOAP问题

时间:2011-03-01 15:59:08

标签: web-services soap xsd wsdl gsoap

我正在使用gSOAP从WSDL文档创建C ++代码。问题是当我在WSDL文件上运行wsdl2h工具时,gSOAP给了我错误。这些错误都与命名空间问题有关。例如

Warning: could not find element 'GetRPCMethods' type '"http://www.broadband-forum.org/cwmp/cwmp-1-2.xsd":GetRPCMethods' in schema urn:tr069

我已经粘贴了命名空间定义以及下面如何使用它们的示例。谁知道我哪里出错了?

urn:tr069应该引用当前文档。

<s0:definitions 
    name="tr069"
    xmlns:s0="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:s1="urn:tr069"
    xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/"
    targetNamespace="urn:tr069">

<s0:types>

<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:tns="urn:tr069" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd1="http://www.broadband-forum.org/cwmp/cwmp-1-2.xsd"
    targetNamespace="urn:tr069">

  <xsd:import namespace="urn:dslforum-org:cwmp-1-2" schemaLocation="cwmp-1-2.xsd" />
  <xsd:element name="GetRPCMethods" type="xsd1:GetRPCMethods" />
</xsd:schema>
</s0:types>
<s0:message name="GetRPCMethods">
     <s0:part element="s1:GetRPCMethods" name="GetRPCMethods" />
</s0:message>
</s0:definitions>

我还有其他一些问题,因为据我所知,目标命名空间不必指向真实位置,它只是指向当前文档的约定,这是正确的吗?同样在cwmp-1-2.xsd中有一个名为GetRPCMethods的元素,它包含一个包含另一个元素的序列。最好的做法是将整个元素(GetRPCMethods)用作上面的消息的一部分,还是应该在消息中定义GetRPCMethods的特定部分?

谢谢。

3 个答案:

答案 0 :(得分:3)

问题是<schema>标记中定义的元素。首先,我删除了<schema>标记内的所有已定义元素,因为它们完全没有必要。然后我将消息部分中元素的名称空间从s1更改为xsd1,以使用cwmp-1-2.xsd中的元素,而不是我在<schema>标记中定义的元素。

至于我的其他问题,targetNameSpace不必指向真正的uri,它只是该文档命名空间的名称。对于我的第二个问题,我认为将整个架构元素用作消息的部分可能是最好也是最简单的。

答案 1 :(得分:0)

我注意到了

  

<xsd:schema>

没有结束标记? wsdl是一个格式良好的XML文档吗?

Targetnamespace是实例文档的名称空间,即SOAP:Envelope的名称空间。

答案 2 :(得分:0)

错误消息显示错误,你没有xsd1的定义:GetRPCMethods,这是在某处定义的吗? s1:查找GetRPCMethods - &gt; s1被发现是urn:trn069 - &gt; urn:trn069不是唯一可能有问题的 - &gt; urn:trn69定义了元素,GetRPCMethods,类型为xsd1:GetRPCMethods - &gt;找不到这种类型。

我不确定对targetNamespace使用相同的URI是否有效。也许这会引起其他问题。