我正在尝试使用gsoap实现ONVIF服务器(nvt)设备。我正在按照gsoap's website中给出的说明和typemap.dat进行代码生成。我对wsdl2h使用“ -P”和“ -x”参数,对soapcpp2使用“ -S -i -x -w”。一切都按预期工作,但有一点古怪之处。
ONVIF核心规范定义了GetServices()操作,该操作在“服务”实现下的响应中包括一个可选的“功能”成员。由于wsdl2h不会创建可选成员(由于我猜是我的参数),因此我对我的typemap文件进行了以下修改:_tds__Service_Capabilities = $ xsd__anyType * Capabilities;
然后,我可以根据服务类型的实现,根据ONVIF规范的要求将此成员分配自定义/派生的功能对象。但是,最终的功能对象始终使用与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);
}
每次重新生成文件时,我都必须应用此修补程序,并且我非常担心这将来可能会引起一些兼容性问题。覆盖名称空间标签的正确方法是什么?
最佳答案
它不需要在typemap.dat文件中进行修改,您应该可以使用gSOAP dom api进行修改。
为了允许将DOM元素分配给xsd_anyType
,您应该在wsdl2h命令中添加-d
:
-d使用DOM填充xs:any和xsd:anyType元素
然后,专门的capabilitites结构分配如下:
tev__Capabilities *tevcapabilities = soap_new_tev__Capabilities(soap);
可以设置为
_any
结构的tds::Capabilities
字段,如下所示:tds__Service_Capabilities *capabilities = soap_new__tds__Service_Capabilities(soap);
capabilities->__any = soap_dom_element(soap, NULL, "tev:Capabilities",
tevcapabilities, tevcapabilities->soap_type());
关于c++ - gSOAP和ONVIF NVT命名空间/标记问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39128088/