Я пытаюсь превратить WSDL-файл в Java код с помощью wsimport
, выполнив команду (которая должна работать с чьей машине):Как сгенерировать файлы Java из WSDL, когда «lang» уже определен?
wsimport https://webservices-uatprod.dhisco.com/OTAHotelDescriptiveInfo/web_services?WSDL -J-Djavax.xml.accessExternalDTD=all -J-Djavax.xml.accessExternalSchema=all -B-XautoNameResolution -Xnocompile
Однако, я получаю эту ошибку:
[ERROR] 'lang' is already defined
line 93 of http://www.w3.org/2001/03/xml.xsd
[ERROR] (related to above error) the first definition appears here
line 43 of http://www.w3.org/2001/xml.xsd
[ERROR] 'space' is already defined
line 102 of http://www.w3.org/2001/03/xml.xsd
[ERROR] (related to above error) the first definition appears here
line 89 of http://www.w3.org/2001/xml.xsd
[ERROR] 'base' is already defined
line 109 of http://www.w3.org/2001/03/xml.xsd
[ERROR] (related to above error) the first definition appears here
line 113 of http://www.w3.org/2001/xml.xsd
[ERROR] 'specialAttrs' is already defined
line 117 of http://www.w3.org/2001/03/xml.xsd
[ERROR] (related to above error) the first definition appears here
line 157 of http://www.w3.org/2001/xml.xsd
Я потратил много времени, чтобы найти решение. Я уверен, что мне нужно указать файл привязки с флагом -b binding.xml
.
Однако мне очень сложно выяснить, как создать этот файл привязки. Вот что я пытался:
binding.xml
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3c.org/2001/XMLSchema"
xmlns:xs="http://www.w3.org/2001/03/xml.xsd"
jaxb:version="2.0">
<jaxb:bindings schemaLocation="http://www.w3.org/2001/xml.xsd">
<jaxb:bindings node="//xs:attribute[@name='lang']">
<jaxb:property name="langAttribute"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
Тогда с этим на месте, я попробуйте запустить с связывающим файл по:
wsimport https://webservices-uatprod.dhisco.com/OTAHotelDescriptiveInfo/web_services?WSDL -J-Djavax.xml.accessExternalDTD=all -J-Djavax.xml.accessExternalSchema=all -B-XautoNameResolution -Xnocompile -b binding.xml
А теперь я получаю:
[ERROR] XPath evaluation of "//xs:attribute[@name='lang']" results in empty target node
line 6 of file:/Users/name/git/foo/bar/src/main/resources/wsdl/binding.xml
Я пробовал много других комбинаций файла привязки файла X Путь ... Я полагаю, мне нужно переименовать атрибут всех элементов из «lang» на что-то еще, но мне действительно было трудно понять его.
Заранее благодарим за любую помощь!
Решение Update: Я миновал эту ошибку, загрузив схему локально, и везде, где имеется ссылка на schemaLocation="http://www.w3.org/2001/03/xml.xsd"
и schemaLocation="http://www.w3.org/2001/xml.xsd"
, я редактировал XML, чтобы указать на мою локальную копию файла в файловой системе.
I.e. открыл каждый * .xsd файл где была ссылка на эти файлы, и обновляется каждую строку из чего-то вроде этого:
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
Для этого:
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="./xml.xsd"/>
После этого, он был в состоянии генерировать Java-классы с использованием синтаксиса wsimport
(требуется один небольшой файл привязки, но это было связано с классом, определенным поставщиком).
Я попытался загрузить схемы и xml-файлы локально, но не знаю, как сообщить wsimport о поиске локальных копий вместо выхода в Интернет. Если у меня есть экземпляр 'xsd.xml' локально ... есть ли способ сказать wsimport использовать это вместо любого, что он может найти в Интернете? – Cuga
Вы делаете это с файлами каталога. Я скоро обновлю ответ. – lexicore
Я уверен, что плагин 'maven-jaxb2' и' wsimport' оба вызываются 'xjc', чтобы получить большую часть этой работы. – Cuga