2016-08-01 92 views
0

我試圖通過運行這個命令(應來自任何人的機器工作)把一個WSDL文件到使用wsimport Java代碼:當'lang'已經定義時如何從WSDL生成Java文件?

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'重命名爲其他東西,但是我真的很難找出它。

在此先感謝您的幫助!

解決方案更新: 我過去的這個錯誤由​​本地下載的模式,並且只要有是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"/> 

之後,它能夠產生使用上面的語法wsimport的Java類(確實需要一個小的綁定文件,但是與供應商定義的類相關)。

回答

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.xsdhttp://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,但通常與目錄完成。假設您已經從目錄w3c中的http://www.w3.org下載了架構。然後你將有一個目錄文件,如

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

然後,您應該能夠通過wsimport -catalog mycatalog.cat ...使用此目錄文件。 wsimport或底層架構編譯器xjc應該從w3c/2001/xml.xsd獲得您的http://www.w3.org/2001/xml.xsd架構。

但是,我從來沒有嘗試過與wsimport,我只是經常與maven-jaxb2-plugin一起使用它。

+0

我試着在本地下載模式和xml文件,但不知道如何告訴wsimport尋找本地副本而不是去互聯網。如果我在本地有'xsd.xml'的副本...有沒有辦法告訴wsimport使用它,而不是它可能在互聯網上找到的任何東西? – Cuga

+0

你可以用目錄文件來做。我會盡快更新答案。 – lexicore

+0

我很確定'maven-jaxb2'插件和'wsimport'都調用'xjc'來完成很多工作。 – Cuga