我正尝试使用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);
}
我必须在每次重新生成文件时应用此修补程序,并且我担心这会在将来导致一些兼容性问题。覆盖命名空间标签的正确方法是什么?