2016-08-01 2 views
0

Я пытаюсь превратить 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 (требуется один небольшой файл привязки, но это было связано с классом, определенным поставщиком).

ответ

0

Вы обязаны свой xs префикс пространства имен XML http://www.w3.org/2001/03/xml.xsd, но он должен быть связан с пространством имен XML Schema http://www.w3.org/2001/XMLSchema:

xmlns:xs="http://www.w3.org/2001/XMLSchema" 

Еще одна проблема, которую вы будете сталкиваться является то, что ваша схема кажется адрес xml.xsd через два разных местоположения: http://www.w3.org/2001/xml.xsd и http://www.w3.org/2001/03/xml.xsd. Это даст вам много дубликатов. Вы можете попытаться решить их с помощью каталогов, как: (. А использование его с -catalog)

REWRITE_SYSTEM "http://www.w3.org/2001/03/" "http://www.w3.org/2001/" 

Но я не уверен, что это будет работать.В подобной ситуации я создал полную локальную копию схем, которые мне нужны для компиляции и исправления, чтобы использовать единые расположения схем.

I tried downloading the schemas and xml files locally, but am not sure how to tell wsimport to look for the local copies instead of going out to the internet. If I have a copy of xsd.xml locally... is there a way to tell wsimport to use that instead of any it may find on the internet?

Я не совсем уверен wsimport, но в целом это делается с каталогами. Предположим, вы загрузили схемы из http://www.w3.org в каталог w3c. Тогда вы будете иметь файл каталога, как

REWRITE_SYSTEM "http://www.w3.org/" "w3c/" 

Тогда вы должны быть в состоянии использовать этот файл каталога с помощью wsimport -catalog mycatalog.cat .... wsimport или базовый компилятор схемы xjc должен получить вашу схему http://www.w3.org/2001/xml.xsd от w3c/2001/xml.xsd.

Однако, я никогда не пробовал его с wsimport, я просто использую его с maven-jaxb2-plugin.

+0

Я попытался загрузить схемы и xml-файлы локально, но не знаю, как сообщить wsimport о поиске локальных копий вместо выхода в Интернет. Если у меня есть экземпляр 'xsd.xml' локально ... есть ли способ сказать wsimport использовать это вместо любого, что он может найти в Интернете? – Cuga

+0

Вы делаете это с файлами каталога. Я скоро обновлю ответ. – lexicore

+0

Я уверен, что плагин 'maven-jaxb2' и' wsimport' оба вызываются 'xjc', чтобы получить большую часть этой работы. – Cuga

Смежные вопросы