【问题标题】:JAXB apply bindings to more than one .xsd schemaJAXB 将绑定应用于多个 .xsd 模式
【发布时间】:2017-10-27 11:19:38
【问题描述】:

我有几个我无法控制的 XML 模式,我想在通过 XJC 生成 Java 类时应用某些自定义。

一些自定义应该适用于所有.xsd 文件,但我不确定如何实现这一点。

目前我有这个.xjb 文件:

<jxb:bindings version="2.1" 
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
  jxb:extensionBindingPrefixes="inheritance">

    <jxb:bindings schemaLocation="../schemas/A.xsd">
         <jxb:schemaBindings>
            <jxb:package name="my.foo.a" />
        </jxb:schemaBindings> 

        <jxb:bindings node="//xs:complexType[@name='A']">
            <jxb:class name="A" />
            <inheritance:implements>my.foo.interfaces.IA</inheritance:implements>           
         </jxb:bindings>

         <jxb:bindings node="//xs:complexType[@name='Device']">
            <jxb:class name="Device" />
            <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>          
         </jxb:bindings>             
    </jxb:bindings>

    <jxb:bindings schemaLocation="../schemas/B.xsd">        
        <jxb:schemaBindings>
            <jxb:package name="my.foo.b" />
        </jxb:schemaBindings>

        <jxb:bindings node="//xs:complexType[@name='B']">
            <jxb:class name="B" />
            <inheritance:implements>my.foo.interfaces.IB</inheritance:implements>       
         </jxb:bindings>

        <jxb:bindings node="//xs:complexType[@name='Device']">
            <jxb:class name="Device" />
            <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>          
         </jxb:bindings>             
    </jxb:bindings>      
</jxb:bindings>

还有这个 Ant 任务:

<taskdef name="xjc" classname="org.jvnet.jaxb2_commons.xjc.XJC2Task">
    <classpath>
        <fileset dir="../../dependencies/lib" >
            <include name="activation-*.jar"/>
            <include name="jaxb-api-*.jar"/>
            <include name="jaxb-impl-*.jar"/>
            <include name="jsr173_api-*.jar"/>
            <include name="stax-api-*.jar"/>

            <include name="jaxb2-basics-jaxb-xjc-*.jar"/>
            <include name="jaxb-xjc-*.jar"/>
            <include name="jaxb2-basics-ant-*.jar"/>
        </fileset>
    </classpath>
</taskdef>

<xjc destdir="../src" extension="true" header="false" binding="bindings.xjb">
    <arg line="-Xinheritance"/>

    <schema dir="../schemas">
        <include name="*.xsd"/>
        <exclude name="Foo.xsd"/>
    </schema>

    <!-- Plugins -->
    <classpath>
        <fileset dir="../../dependencies/lib">
            <!-- JAXB2 Basics library -->
            <include name="jaxb2-basics-*.jar"/>
            <!-- JAXB2 Basics library dependencies -->
            <include name="jaxb2-basics-runtime-*.jar"/>
            <include name="jaxb2-basics-tools-*.jar"/>
            <include name="javaparser-*.jar"/>
            <include name="commons-beanutils-*.jar"/>
            <include name="commons-lang-*.jar"/>
            <include name="commons-logging-*.jar"/>
        </fileset>
    </classpath>
</xjc>

最后我想做的是以某种方式指定公共块(其中我有多个),即:

<jxb:bindings node="//xs:complexType[@name='Device']">
    <jxb:class name="Device" />
    <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>          
</jxb:bindings> 

对于我所有的.xsd 文件。

假设是这样的:

<jxb:bindings version="2.1" 
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
  jxb:extensionBindingPrefixes="inheritance">

    <jxb:bindings schemaLocation="../schemas/*.xsd">
        <jxb:bindings node="//xs:complexType[@name='Device']">
            <jxb:class name="Device" />
            <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>          
        </jxb:bindings>  
    </jxb:bindings>

    <jxb:bindings schemaLocation="../schemas/A.xsd">
        <jxb:schemaBindings>
            <jxb:package name="my.foo.a" />
        </jxb:schemaBindings> 

        <jxb:bindings node="//xs:complexType[@name='A']">
            <jxb:class name="A" />
            <inheritance:implements>my.foo.interfaces.IA</inheritance:implements>           
        </jxb:bindings>           
    </jxb:bindings>

    <jxb:bindings schemaLocation="../schemas/B.xsd">        
        <jxb:schemaBindings>
            <jxb:package name="my.foo.b" />
        </jxb:schemaBindings>

        <jxb:bindings node="//xs:complexType[@name='B']">
            <jxb:class name="B" />
            <inheritance:implements>my.foo.interfaces.IB</inheritance:implements>       
        </jxb:bindings>       
    </jxb:bindings>      
</jxb:bindings>

我怎样才能做到这一点?

【问题讨论】:

    标签: java jaxb jaxb2 xjc jaxb2-basics


    【解决方案1】:

    所以,对于(大部分)在这里使用这个答案:https://stackoverflow.com/a/18592030/770023

    我已经设法让架构正常工作,作为参考,您需要做的只是设置schemaLocation="*"(当然是为了读取所有架构)并用multiple="true"required="false" 标记绑定元素,因为有些模式可能包含这些元素(一次或多次),有些可能根本不包含这些元素。

    <jxb:bindings version="2.1" 
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
      jxb:extensionBindingPrefixes="inheritance">
    
        <jxb:bindings schemaLocation="*">
            <jxb:bindings node="//xs:complexType[@name='Device']" multiple="true" required="false">
                <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>          
            </jxb:bindings>  
        </jxb:bindings>
        <!-- rest of the bindings (per schema ones) go here -->
    </jxb:bindings>
    

    请注意,由于某些(我不知道的)原因,我必须删除class 绑定(例如&lt;jxb:class name="Device" /&gt;)才能让XJC 接受该文件。

    它大部分都可以工作,我无法工作的是inheritance:extends 自定义,它不想在与implements 相同的条件下运行...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多