Я пытаюсь сгенерировать код с помощью wsdl2h / soap2cpp для WSDL медиа-файлов onvif http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl. У этого wsdl есть некоторые зависимости.
Чтение FAQ по 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 есть интересная опция:
-я не импортирую (расширенный вариант)
Поэтому я загружаю то, что было загружено с помощью wsdl2h:
И следующий запуск
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-адресации. Затем я попробовал разные вещи, импортируя больше xsd, но я не нашел способа устранить отсутствующие зависимости.
Возможно, это неправильный способ сборки из локального файла. Во всяком случае, я хотел бы избегайте любых изменений в wsdls и xsd файлы. Альтернативой может быть каталог для сопоставления удаленного URL с локальным (например, Apache CXF), но я не нашел ничего подобного в документации по gSOAP.
Спасибо, что поделились своим опытом.
Я нашел только частичную документацию формата typemap.dat с сайта gSOAP http://www.cs.fsu.edu/~engelen/soapdoc2.html. Однако я заметил, что некоторые определения пространства имен используют <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
Других решений пока нет …