2016-08-24 34 views
0

我正嘗試使用gsoap實現ONVIF服務器(nvt)設備。我遵循gsoap's website中給出的說明和typemap.dat來生成代碼。我爲wsdl2h使用「-P」和「-x」參數,爲soapcpp2使用「-S -i -x -w」。一切都按預期工作,但有一點點怪癖。gSOAP和ONVIF NVT命名空間/標籤問題

ONVIF核心規範定義了GetServices()動作,其中包含一個可選的「Capabilities」成員,其響應在「服務」實現下。由於可選的成員不是由wsdl2h創建(由於我的參數我猜),我提出以下修改我的類型表文件:

_tds__Service_Capabilities = $ xsd__anyType * Capabilities;

然後我能夠指定自定義/導出功能反對這種成員根據ONVIF規範的要求,具體取決於服務類型的實現。但是,最終的Capabilities對象始終使用與所需操作不同的GetServices()操作的相同名稱空間表示。比如這裏是預期的響應(簡體):

<tds:Service> 
    <tds:Capabilities> 
     <tds:Capabilities> 
     </tds:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 
<tds:Service> 
    <tds:Capabilities> 
     <trt:Capabilities> 
     ... 
     </trt:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 
<tds:Service> 
    <tds:Capabilities> 
     <tev:Capabilities> 
      ... 
     </tev:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 

而實際反應是:

<tds:Service> 
    <tds:Capabilities> 
     <tds:Capabilities> 
     </tds:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 
<tds:Service> 
    <tds:Capabilities> 
     <tds:Capabilities> 
     ... 
     </tds:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 
<tds:Service> 
    <tds:Capabilities> 
     <tds:Capabilities> 
      ... 
     </tds:Capabilities> 
    </tds:Capabilities> 
</tds:Service> 

爲了克服這個怪癖,我申請以下難看的補丁,以創建soapC.cpp文件:

@@ -42068,7 +51777,7 @@ void tev__Capabilities::soap_serialize(struct soap *soap) const 

int tev__Capabilities::soap_out(struct soap *soap, const char *tag, int id, const char *type) const 
{ 
- return soap_out_tev__Capabilities(soap, "tev:Capabilities", id, this, type); 
+ return soap_out_tev__Capabilities(soap, tag, id, this, type); 
} 

SOAP_FMAC3 int SOAP_FMAC4 soap_out_tev__Capabilities(struct soap *soap, const char *tag, int id, const tev__Capabilities *a, const char *type) 
@@ -64741,7 +74450,7 @@ void trt__Capabilities::soap_serialize(struct soap *soap) const 

int trt__Capabilities::soap_out(struct soap *soap, const char *tag, int id, const char *type) const 
{ 
- return soap_out_trt__Capabilities(soap, "trt:Capabilities", id, this, type); 
+ return soap_out_trt__Capabilities(soap, tag, id, this, type); 
} 

我必須在每次重新生成文件時應用此修補程序,並且我擔心這會在將來導致一些兼容性問題。覆蓋命名空間標籤的正確方法是什麼?

回答

1

它不應該需要在typemap.dat文件中修改,你應該能夠使用gSOAP dom api來做到這一點。

爲了允許DOM元素分配給xsd_anyType你應該添加-d到wsdl2h命令:

-d使用DOM填充的xs:any和xsd:anyType的元素

然後專門的能力結構,分配類似於:

tev__Capabilities *tevcapabilities = soap_new_tev__Capabilities(soap); 

可以設置t tds::Capabilities結構的_any字段如下:

tds__Service_Capabilities *capabilities = soap_new__tds__Service_Capabilities(soap); 
capabilities->__any = soap_dom_element(soap, NULL, "tev:Capabilities", 
          tevcapabilities, tevcapabilities->soap_type());