2017-10-27 10 views
0

私には制御できないXMLスキーマがいくつかあります.XJCを使用してJavaクラスを生成する際に、特定のカスタマイズを適用したいと思います。JAXB複数の.xsdスキーマへのバインドを適用します。

一部のカスタマイズはすべての.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/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> 

最後に私がやりたいものを何とか(Iの共通ブロックを指定することで、私はこの.xjbファイルを持っている瞬間

すなわち、)以上のものを持っている:私の.xsdファイルのすべてのために

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

をs。

仮に、このような何か:

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

どのように私はこれを達成することができますか?

答えて

0

だから、こここの回答を使用して(大部分)のために:https://stackoverflow.com/a/18592030/770023

私は、スキーマの作業を取得するために管理している、参照のためのあなたはすべてのスキーマを読み込むために(schemaLocation="*"設定するだけです、いくつかのスキーマにこれらの要素が含まれている場合があり(1回以上)、まったく含まれていない場合があるので、バインディング要素には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> 

私はXJCによって受け入れられるためのファイルをclassバインディング(例えば。<jxb:class name="Device" />)を削除しなければならなかったいくつかの(私には不明)の理由であることに注意してください。私は作業を取得することができていない私はほとんど機能し

は、...

implements 1と同じ条件の下で実行する必要はありません inheritance:extendsカスタマイズ、あります
関連する問題