我正在尝试通过运行此命令(可以在任何人的计算机上运行)使用wsimport
将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
我花了几个小时在Google上搜索,试图找到解决方案。我相信我需要使用-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
我已经尝试了绑定文件的XPath的许多其他组合...我想我需要将所有元素的属性从'lang'重命名为其他东西,但我真的很难搞清楚它。
提前感谢您的帮助!
解决方案更新:
我通过在本地下载模式来解决此错误,并且只要有schemaLocation="http://www.w3.org/2001/03/xml.xsd"
和schemaLocation="http://www.w3.org/2001/xml.xsd"
的引用,我就编辑了XML以指向文件系统上文件的本地副本。
即。打开了每个* .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 :(得分: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
问题。那将会给你带来很多重复。您可以尝试通过以下目录解决它们:
REWRITE_SYSTEM "http://www.w3.org/2001/03/" "http://www.w3.org/2001/"
(与-catalog
一起使用。)
但我不确定这会奏效。在类似的情况下,我创建了一个完整的本地模式副本,我需要编译并修补它们以使用统一的模式位置。
我尝试在本地下载模式和xml文件,但我不知道如何告诉wsimport查找本地副本而不是去网上。如果我在本地有xsd.xml的副本...有没有办法告诉wsimport使用它而不是在互联网上找到它?
我不完全确定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
一起使用。