JAXB

2012-03-13 18 views
8
と同じ要素のいくつかのXSDの含む重複定義をコンパイルし

質問: どのように私は、XJC/JAXBは、同じ名前空間内の重複elementdefinitionsを含むいくつかのスキーマのpropperのjavaclassesを生成するのですか?JAXB

情報: 私は3つの.xsdスキーマを持っています:A、B、Cはすべて同じtargetnamespaceを持っています。 彼らは私に与えられた三つのshemasであり、私はどのような方法ででもそれらを変更することを許されていません。

彼らAもB又はCに見出されるいくつかの要素を有している(ただし、Aは、自己の多くが同様の要素を宣言した) 例:これは、AとCのために同じ「コード」である。

<xs:simpleType name="y_ym_ymdDatoType"> 
    <xs:union memberTypes="arcgYearType arcgYearMonthType arcDateType"/> 
</xs:simpleType> 
<xs:simpleType name="arcgYearType"> 
    <xs:restriction base="xs:gYear"> 
     <xs:minInclusive value="1700"/> 
     <xs:maxInclusive value="2100"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcgYearMonthType"> 
    <xs:restriction base="xs:gYearMonth"> 
     <xs:minInclusive value="1700-01"/> 
     <xs:maxInclusive value="2100-12"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcDateType"> 
    <xs:restriction base="xs:date"> 
     <xs:minInclusive value="1700-01-01"/> 
     <xs:maxInclusive value="2100-12-31"/> 
    </xs:restriction> 
</xs:simpleType> 
javaclassesにそれらをコンパイルするXJCを使用する場合は

、私は次の例外を取得:arcgYearType、arcgYearMonthTypeとarcDateType:

[ERROR] 'y_ym_ymdDatoType' is already defined 
line 297 of file:../c.xsd 

[ERROR] (related to above error) the first definition appears here 
line 309 of file:../a.xsd 

と同じことが他の要素に起こります。

私はこの問題を解決する可能性のあるバインディングファイルについて読んだことがありますが、それを行う方法はわかりませんので、例が非常に優先されます。

答えて

0

バインディングファイルを使用して競合を手動で解決できます。ここでは、競合する名前のためにカスタム名を指定することができますたとえば、次のとおりです。

<bindings schemaLocation="../party.xsd" version="1.0" node="/xs:schema"> 
    <bindings node="//xs:complexType[@name='FixedIncomeBook']"> 
     <class name="PartyFixedIncomeBook"/> 
    </bindings> 
</bindings> 
+0

XML要素が実際に出てくるときに名前を変更するのではなく、生成されたjavaclassesの名前を変更するだけですか? –

+0

生成されたJavaクラスの名前を変更しています。デフォルトで 'FixedIncomeBook.java'を取得し、このバインディングで' PartyFixedIncomeBook.java'を取得します –

+0

私は以下を取得します:[ERROR]サポートされていないバインディング名前空間 ""。おそらくあなたは "http://java.sun.com/xml/ns/jaxb/xjc"を意味しましたか? ファイルの行4:/../ C.xsd 行番号4はスキーマ定義です。 何が間違っているのですか? –

2

あなたが記述するものから、私は、XSDファイルとの関係を含め一切がないことを前提としています。また、コンテンツが重複するクラスを再利用しようとしていると仮定しなければなりません。

各ファイルを個別に「コンパイル」し、各XSDファイルに異なるJavaパッケージを提供するのが簡単な方法です。ここで問題となるのは、あるXMLから別のXMLへのコンテンツのチェーン化(つまり、マーシャリングからBへのマーシャリング)、次にパッケージcom.AのクラスC1とパッケージcom.BのクラスC1の間に、同じXSD複合型と一致するかどうかは、 "交換可能"ではありません。それらの間の変換を開発する必要があります。カスタムバインディングファイルが必要です。また、NetBeansを使用する場合は、単にJAXBウィザードで別のパッケージを設定してください。

最善の方法は、エピソードを使用することです(this on SOを参照)。 A.xsdを処理して、そのエピソードを使ってB.xsdなどを処理してください。

+0

1.いいえ含まれていません。 2.はい、私は再利用したい、彼らは同じですが、それは第一の目標ではないので、もし何か他のことをするのが簡単なら、そうすることもできます。 私はC.xsdのA.xsdに何か興味がありません。私は同じプロジェクトですべてを使用しています。 xsdは同じTNSから来ていますが、パッケージを遅らせるための簡単な方法はありますか? –

+0

@Sofus、なぜあなたはエピソードを使用していませんか?あるいは、異なる名前空間をターゲットとするカスタムバインディングを使用して、各パッケージに対してxjcを実行しますか? –

+0

20時間ほどで試してみよう、よかったよ –