JAXB 2.1 実装 (Metro、EclipseLink MOXy、Apache JaxMe など) を使用すると、スキーマ タイプが既存のクラスに対応するように指定して、それらが生成されないようにすることができます。
例えば:
root.xsd
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/root">
<xsd:import schemaLocation="imported.xsd" namespace="http://www.example.com/imported"/>
<xsd:complexType name="root">
<xsd:attribute name="root-prop" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
インポートされた.xsd
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.example.com/imported"
targetNamespace="http://www.example.com/imported">
<xsd:complexType name="imported">
<xsd:attribute name="imported-prop" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
問題文
XJC ツールを使用して XML スキーマから Java クラスを生成する場合:
xjc -d out root.xsd
以下が生成されます。
com\example\imported\Imported.java
com\example\imported\ObjectFactory.java
com\example\imported\package-info.java
com\example\root\ObjectFactory.java
com\example\root\Root.java
com\example\root\package-info.java
import-bindings.xml
JAXB バインディング ファイルを使用して、imported.xsd の型が既存のクラスを指すように指定できます。
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jxb:bindings schemaLocation="imported.xsd">
<jxb:bindings node="//xs:complexType[@name='imported']">
<jxb:class ref="com.example.imported.Imported"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
XJC の実行
ここで、バインディング ファイルなしで XJC を実行すると、次のようになります。
xjc -d out -b imported-bindings.xml root.xsd
バインディング ファイルで指定されたファイルは生成されません。
com\example\root\ObjectFactory.java
com\example\root\Root.java
com\example\root\package-info.java
代替アプローチ
インポートされたスキーマから直接生成されるコード (xjc import.xsd) と間接的に生成されるコード (xjc root.xsd) は同じです。間接的に生成されたコードをドロップして、直接生成されたコードを含むプロジェクトを指定するだけです。