Java:将XSD文件转换为Java类

时间:2017-04-03 09:34:35

标签: java xml xsd xjc ota

我目前正在使用xjc在java类中转换我的xsd文件。我的应用程序基于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文件添加一些额外的绑定。 对于拥有少量.xsd文件的人来说,这是一个很好的方法但对我来说,必须转换超过300个.xsd文件,这似乎是不可能的。

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

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

1 个答案:

答案 0 :(得分:1)

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

<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>

使用此绑定文件,XJC将成功生成大多数ota版本的java类。对于某些ota版本,我们甚至不需要像ota2008b版本这样的绑定文件。

为了运行上一个命令,我们只需添加路径到哪里就是我们的绑定文件: sudo xjc -b /bindings.xjb -d src / destination / folder1 / source / OTA_HotelResModifyNotifRQ.xsd