2011-03-01 64 views
2

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

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

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

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

0

我注意到

<xsd:schema>

没有关闭标签? wsdl是一个格式良好的XML文档吗?

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

+0

对不起,我没有正确粘贴它的问题,我编辑了这个问题。是的,文件格式良好。所以targetNamespace可以是任何东西? – toc777 2011-03-01 16:18:28

+0

是的,它可以是任何URI(URL或URN),但确保它是有意义的。例如,如果您决定使用URI并拥有域“mydomain”,我宁愿将它保留为> http:// mydomain/xml/types/item – javadeveloper 2011-03-02 15:14:49

0

错误消息说错了什么,你没有定义xsd1:GetRPCMethods,这是在什么地方定义的? s1:GetRPCMethods被查找 - > s1被发现是urn:trn069 - > urn:trn069不是唯一的,这可能是一个问题 - > urn:trn69定义元素,GetRPCMethods类型为xsd1:GetRPCMethods - > this类型未找到。

我不确定对targetNamespace使用相同的URI是否有效。也许这是造成额外的问题。

+0

它在架构元素“xmlns:xsd1 =”中定义http://www.broadband-forum.org/cwmp/cwmp-1-2.xsd“'它似乎在读这个文件,所以我不明白为什么它找不到GetRPCMethods – toc777 2011-03-01 16:53:28

+0

你确定它正在阅读这个模式文件? AFAIK,通常解析器不会打开名称空间URI。您是否尝试过在定义和模式标记中使用不同的目标命名空间? – Bernhard 2011-03-02 08:32:54

+0

是的,这是真的,但它会打开任何它不知道的导入名称空间。我明确导入上面的命名空间。 – toc777 2011-03-02 11:26:34