当 '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.xsdhttp://www.w3.org/2001/xml.xsdhttp://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