2017-10-27 4 views
0

Ich habe mehrere XML-Schemas, über die ich keine Kontrolle habe, und ich möchte bestimmte Anpassungen anwenden, wenn ich die Java-Klassen über XJC erzeuge.JAXB wenden Bindungen auf mehr als ein .xsd-Schema an

Einige Anpassungen sollten für alle .xsd Dateien gelten, aber ich bin nicht sicher, wie dies zu erreichen ist.

Im Moment habe ich diese .xjb Datei:

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

Und diese Ant-Task:

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

Schließlich, was ich irgendwie tun möchte, um die gemeinsamen Blöcke angeben (von denen ich haben mehr als eine), dh:

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

Für alle meine .xsd Datei s.

Hypothetisch, etwa wie folgt:

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

Wie kann ich das erreichen?

Antwort

0

So zum (meist) mit dieser Antwort hier: https://stackoverflow.com/a/18592030/770023

ich es geschafft haben, das Schema zum Laufen zu bringen, als Referenz alles, was Sie tun müssen, ist schemaLocation="*" gesetzt (um alle Schemata zu lesen, natürlich) und markieren Sie die Bindungselemente mit multiple="true" und required="false" da einige Schemas diese Elemente (einmal oder mehrmals) enthalten können, einige enthalten sie überhaupt nicht.

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

Bitte beachten Sie, dass für einige (mir unbekannt) Grund hatte ich die class Bindungen zu entfernen (zB. <jxb:class name="Device" />) für die Datei von XJC in Kauf genommen werden.

ich meistens funktioniert, was ich nicht in der Lage zum Laufen zu bringen ist die inheritance:extends Anpassung, die nicht

unter den gleichen Bedingungen wie die implements ein ... laufen will
Verwandte Themen