Java JAXB将绑定应用于多个.xsd模式

Java JAXB将绑定应用于多个.xsd模式,java,jaxb,jaxb2,xjc,jaxb2-basics,Java,Jaxb,Jaxb2,Xjc,Jaxb2 Basics,我有几个无法控制的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

我有几个无法控制的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>
我怎样才能做到这一点呢?

因此,在这里使用这个答案(大部分):

我已经设法使模式正常工作,为了便于参考,您只需设置
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>

my.foo.interfaces.IDevice
请注意,由于某种原因(我不知道),我不得不删除
绑定(例如
),以便XJC接受该文件

它基本上是有效的,但我一直无法使用的是
继承:扩展
定制,它不希望在与
实现
一个相同的条件下运行…

因此,对于(大部分)使用以下答案:

我已经设法使模式正常工作,为了便于参考,您只需设置
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>

my.foo.interfaces.IDevice
请注意,由于某种原因(我不知道),我不得不删除
绑定(例如
),以便XJC接受该文件

它基本上是有效的,但我一直无法使用的是
继承:扩展
定制,它不希望在与
实现
相同的条件下运行

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