0

我正在尝试使用 wsdl2h/soap2cpp 为 onvif 媒体 WSDL http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl生成代码。这个 wsdl 有一些依赖项。

阅读 gSOAP 常见问题解答http://www.cs.fsu.edu/~engelen/soapfaq.html,我最终在 typemap.dat 中提取了所需的命名空间

trt = "http://www.onvif.org/ver10/media/wsdl"
tt  = "http://www.onvif.org/ver10/schema"
wsnt    = "http://docs.oasis-open.org/wsn/b-2"
wsrfbf  = "http://docs.oasis-open.org/wsrf/bf-2"
wstop   = "http://docs.oasis-open.org/wsn/t-1"
xop="http://www.w3.org/2004/08/xop/include"
wsa5    = <http://www.w3.org/2005/08/addressing>

使用此映射,gSOAP 代码生成器可以正确运行:

wsdl2h media.wsdl
soapcpp2 -2ix media.h -I /usr/share/gsoap/import

但这需要有互联网连接。我想使用本地存储的文件进行构建。

在 wsdl2h 帮助中有一个看起来很有趣的选项:

-i 不导入(高级选项)

所以我下载了 wsdl2h 下载的内容:

  1. http://www.onvif.org/onvif/ver10/schema/onvif.xsd
  2. http://docs.oasis-open.org/wsn/b-2.xsd
  3. http://www.w3.org/2004/08/xop/include
  4. http://docs.oasis-open.org/wsrf/bf-2.xsd
  5. http://docs.oasis-open.org/wsn/t-1.xsd

下一次运行

wsdl2h -im media.wsdl onvif.xsd b-2.xsd include bf-2.xsd t-1.xsd
soapcpp2 -2ix media.h -I /usr/share/gsoap/import

但是这种输出失败了:

**  The gSOAP code generator for C and C++, soapcpp2 release 2.8.7
**  Copyright (C) 2000-2011, Robert van Engelen, Genivia Inc.
**  All Rights Reserved. This product is provided "as is", without any warranty.
**  The soapcpp2 tool is released under one of the following two licenses:
**  GPL or the commercial license by Genivia Inc.

media.h(164): syntax error
media.h(163): Syntax error: declaration expected
media.h(173): syntax error
...

在 media.h 中,来自 ws-addressing 的代码引用结构。接下来我尝试了不同的方法来导入更多的 xsd,但我没有找到解决缺失依赖项的方法。也许这不是从本地文件构建的正确方法。无论如何,我想避免对 wsdls和 xsd 文件进行任何修改。另一种方法可能是将远程 url 映射到本地 url(如 Apache CXF)的目录,但我在 gSOAP 文档中没有找到类似的内容。

感谢您分享您的经验。

4

1 回答 1

1

我从 gSOAP 站点http://www.cs.fsu.edu/~engelen/soapdoc2.html仅找到了 typemap.dat 格式的部分文档。但是我注意到一些命名空间定义使用<url>而不是"url". 经过一些尝试,这给出了问题的解决方案,定义了包含在 <> 中的命名空间。

所以我像这样修改了typemap.dat:

trt=<http://www.onvif.org/ver10/media/wsdl>
tt=<http://www.onvif.org/ver10/schema>
wsnt=<http://docs.oasis-open.org/wsn/b-2>
wsrfbf=<http://docs.oasis-open.org/wsrf/bf-2>
wstop=<http://docs.oasis-open.org/wsn/t-1>
xop=<http://www.w3.org/2004/08/xop/include>
wsa5=<http://www.w3.org/2005/08/addressing>

然后可以从 media.wsdl 生成代码而无需连接到互联网:

wsdl2h media.wsdl onvif.xsd b-2.xsd include bf-2.xsd t-1.xsd
soapcpp2 -2ix media.h -I /usr/share/gsoap/import
于 2014-03-27T19:31:02.020 回答