当'lang'已经定义时,如何从WSDL生成Java文件?

时间:2016-08-01 16:41:21

标签: java xpath jaxb xjc wsimport

我正在尝试通过运行此命令(可以在任何人的计算机上运行)使用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类(确实需要一个小的绑定文件,但这与供应商定义的类有关)。

1 个答案:

答案 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.xsdhttp://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一起使用。