0

私は JAXB-RI を使用しようとしてきましたが、XSD 用のクラスを生成するのは xjc です (XSD と言うときは、恐ろしく完成した XSD を意味します。これについては後で詳しく説明します)。

最初の問題は、セットアップ全体で合計 2 つの名前空間しかないことです。それにもかかわらず、同じことが別々のファイルで複数回定義されており、名前はわずかに異なりますが、XSD には区別するものはありません。たとえば、2 つの XSD を持つことができます

bar_v01_00.xsd

<xsd:schema xmlns="http://www.foo.com/" targetNamespace="http://www.foo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xsd:element name="foo">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:element name="elem1" type="xsd:string" />
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

bar_v02_00.xsd

<xsd:schema xmlns="http://www.foo.com/" targetNamespace="http://www.foo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xsd:element name="foo">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:element name="elem1" type="xsd:string" />
                <xsd:element name="elem2" type="xsd:string" />
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

つまり、同じ名前、同じ名前空間、ファイルが異なるだけです。これを回避するには、2 つの異なるパッケージを指定するので、bar_v01_00.xsd が入ります。

package www.foo.com.bar.Major01.Minor00;

bar_v02_00.xsd は次のようにコンパイルされます。

package www.foo.com.bar.Major02.Minor00;

確かにエレガントではありませんが、効果的です。現在、これらのファイルにはインクルード/インポートを含めることができ、それぞれにさらに多くのインクルード/インポートを含めることができ、そのうちのいくつかは 32 レベルの深さにすることができます! 概して、これらのインクルードには理由があります。つまり、何度も再利用されます。

私が所有しているサービスは 120 を超えており、それぞれに要求と応答の XSD があり、おそらく半分には上記のように複数のバージョンがあります。これをリファクタリングして合計 636 個のファイルにすることができましたが、これは並大抵のことではありませんでした。

同じ共通のものを個別のパッケージに 300 コピーしたくないので、.episode ファイルを使用してみました。それは機能しますが、レベル 3 相当のインクルードまでしかありません。3 つ以上の .episodes を含めようとすると、xjc が停止します。エピソードをjarファイルに入れてみたところ、そのように1つのエピソードしか見えないことに気付きました。エピソードのコンテンツを 1 つのファイルに結合しようとしても、うまくいきません。

私にできることはありますか、それともここで立ち往生していますか?

4

1 に答える 1

0

依存するすべてのエピソード ファイルを 1 つの大きなファイルに追加して含めるより良い方法を見つけました。いくらかの作業と解析と思考が必要ですが、すべて自動化されており、機能します。

于 2012-12-06T17:44:43.770 に答える