【问题标题】:gSOAP and ONVIF NVT Namespace/Tag IssuegSOAP 和 ONVIF NVT 命名空间/标签问题
【发布时间】:2016-08-24 16:02:49
【问题描述】:

我正在尝试使用 gsoap 实现 ONVIF 服务器 (nvt) 设备。我正在按照gsoap's website 中给出的说明和 typemap.dat 进行代码生成。我对 wsdl2h 使用“-P”和“-x”参数,对 soapcpp2 使用“-S -i -x -w”。一切都按预期工作,但有一点小问题。

ONVIF 核心规范定义了 GetServices() 操作,该操作在“服务”实现下的响应中包含一个可选的“能力”成员。由于可选成员不是由 wsdl2h 创建的(由于我猜是我的参数),我对我的类型映射文件进行了以下修改:

_tds__Service_Capabilities = $ xsd__anyType * Capabilities;

然后,我可以根据 ONVIF 规范的要求,根据服务类型实现将自定义/派生的 Capabilities 对象分配给该成员。但是,最终的 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);
 }

我每次重新生成文件时都必须应用这个补丁,我非常担心这可能会在将来导致一些兼容性问题。覆盖命名空间标签的正确方法是什么?

【问题讨论】:

    标签: c++ gsoap onvif


    【解决方案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);
    

    可以像这样设置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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2015-04-24
      • 2011-02-05
      • 1970-01-01
      • 2023-01-17
      相关资源
      最近更新 更多