Java:将 XSD 文件转换为 Java 类

标签 java xml xsd xjc ota

我目前正在使用 xjc 将我的 xsd 文件转换为 java 类。我的应用程序基于 ota-opentravel ( http://www.opentravel.org/ ) 标准,因此我下载了 ota-2016b 版本的 xsd 文件,并尝试转换 java 类中的所有 xsd 文件。我收到以下错误:

Property "Value" is already defined. 
Use <jaxb:property> to resolve this conflict.

The following location is relevant to the above error
line 5848 of file:/OTA_CommonTypes.xsd
line 1836 of file:/OTA_Lists.xsd
line 6820 of file:/OTA_CommonTypes.xsd
etc

我找到了很多如何解决此问题的示例,其中之一是指定 .xjb 文件并为我遇到问题的 .xsd 文件添加一些附加绑定(bind)。 对于只有很少 .xsd 文件的人来说,这是一个很好的方法,但对于必须转换超过三百个 .xsd 文件的我来说,这似乎是不可能的。

我还发现了一些 maven ota_travel 依赖项,其中我已经生成了所有内容,但它们支持的最新版本是 ota_v2014,我还需要版本 ota_v2015 和 ota_v2016。

我用来在java类中转换这些.xsd文件的命令是:sudo xjc -d src/destination/folder1/source/OTA_HotelResModifyNotifRQ.xsd

最佳答案

我正在搜索并找到以下解决方案:

<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              jxb:version="2.0">

        <jxb:bindings schemaLocation="OpenTravel_2015B_XML/OTA_CommonTypes.xsd" node="/xs:schema">
           <jxb:bindings node="//xs:element[@name='CalculationMethod']/xs:complexType/xs:sequence/xs:element[@name='Duration']/xs:complexType">
                <jxb:bindings node=".//xs:attribute[@name='Value']">
                    <jxb:property name="ValueToFixError1"/>
                </jxb:bindings>
            </jxb:bindings>
            <jxb:bindings node="//xs:element[@name='MaximumDuration']/xs:complexType">
                <jxb:bindings node=".//xs:attribute[@name='Value']">
                    <jxb:property name="ValueToFixError2"/>
                </jxb:bindings>
            </jxb:bindings>
            <jxb:bindings node="//xs:element[@name='StartAndEnd']/xs:complexType/xs:choice/xs:element[@name='Duration']/xs:complexType">
                <jxb:bindings node=".//xs:attribute[@name='Value']">
                    <jxb:property name="ValueToFixError3"/>
                </jxb:bindings>
            </jxb:bindings>
            <jxb:bindings node="//xs:complexType[@name='OntologyDistanceType']/xs:sequence/xs:element[@name='Distance']/xs:complexType">
                <jxb:bindings node=".//xs:attribute[@name='Value']">
                    <jxb:property name="ValueToFixError4"/>
                </jxb:bindings>
            </jxb:bindings> 
        </jxb:bindings>
</jxb:bindings>

有了这个绑定(bind)文件,XJC 将成功为大多数 ota 版本生成 java 类。对于某些ota版本,我们甚至不需要像ota2008b版本这样的绑定(bind)文件。

为了运行前面的命令,我们只需添加绑定(bind)文件所在的路径: sudo xjc -b/bindings.xjb -d src/destination/folder1/source/OTA_HotelResModifyNotifRQ.xsd

关于Java:将 XSD 文件转换为 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43181148/

相关文章:

java - JAXb(版本 2.2.8)以错误的格式编码 gmonth

java - Spring SOAP 合并 .xsd 文件

Java 正则表达式 - 一种用于计算匹配项的代码

android - 渲染期间引发异常 : 16 (Details)

Java不打印小数位

xml - 在 Actionscript 3 中添加子级的循环

python - 我想将 res.partner 地址中的实际城市字段更改为 Many2one 字段,而不添加新字段

python - Sabre GetReservation wsdl 不包含 PriceQuoteServices 的架构

java - 是否可以在 Glassfish 3 上使用 Java 8?

java - Maven 覆盖传递依赖