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