我正在尝试使用 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 下载的内容:
- http://www.onvif.org/onvif/ver10/schema/onvif.xsd
- http://docs.oasis-open.org/wsn/b-2.xsd
- http://www.w3.org/2004/08/xop/include
- http://docs.oasis-open.org/wsrf/bf-2.xsd
- 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 文档中没有找到类似的内容。
感谢您分享您的经验。