2011-03-01 65 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