JAXB применяет привязки к более чем одной схеме.xsd
У меня есть несколько схем XML, над которыми у меня нет контроля, и я хотел бы применить определенные настройки при создании классов Java через XJC.
Некоторые настройки должны применяться ко всем .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>
И эта задача Муравья:
<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>
Как я могу сделать это?
1 ответ
Итак, для (большей части) использования этого ответа здесь: /questions/22026307/vyibor-uzlov-s-xpath-dlya-svyazyivaniya-podmnozhestva-klassov-s-jaxb/22026321#22026321
Мне удалось заставить схему работать, для справки все, что вам нужно сделать, это установить 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
привязки (например, <jxb:class name="Device" />
) для файла, который будет принят XJC.
Я в основном работаю, что я не смог получить работу, так это inheritance:extends
настройка, которая не хочет работать в тех же условиях, что и implements
один...