当 'lang' 已经定义时,如何从 WSDL 生成 Java 文件?
How to generate Java files from WSDL when 'lang' already defined?
我正在尝试通过 运行 使用 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
我花了几个小时在谷歌上搜索,试图找到解决方案。我比较确信我需要使用 -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 classes(确实需要一个小的绑定文件,但这与供应商有关-定义 class).
您已将 xs
前缀绑定到 XML 命名空间 http://www.w3.org/2001/03/xml.xsd
,但它应该绑定到 XML 架构命名空间 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
一起使用。)
但我不确定这是否有效。在类似的情况下,我创建了一个完整的模式本地副本,我需要编译和修补它们以使用统一的模式位置。
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
。
我正在尝试通过 运行 使用 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
我花了几个小时在谷歌上搜索,试图找到解决方案。我比较确信我需要使用 -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 classes(确实需要一个小的绑定文件,但这与供应商有关-定义 class).
您已将 xs
前缀绑定到 XML 命名空间 http://www.w3.org/2001/03/xml.xsd
,但它应该绑定到 XML 架构命名空间 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
一起使用。)
但我不确定这是否有效。在类似的情况下,我创建了一个完整的模式本地副本,我需要编译和修补它们以使用统一的模式位置。
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
。