そうです、Castor は静的マッピングを期待しています。しかし、あなたはそれで働くことができます。着信 xml を変更するコードを記述して、お客様側では Castor が 1 つのスキーマを使用できるようにし、クライアント側ではスキーマを変更する必要がないようにすることができます。
Castor が取得することを期待するスキーマを、共通のルート要素を持つものに変更します。その下には、さまざまなオブジェクトの 9 つの異なる代替があります (スキーマが 9 つのうちの 1 つだけを許可するように制限できると思います。すべてのサブ要素をオプションにするだけでうまくいくことはありません)。
次に、受信 xml を変更して受信 xml をその共通のルート要素でラップするコードを記述し、ラップされた xml をストリームにフィードして、Castor unmarshaller が読み取ります。
xml ラッピング部分を実装するには、少なくとも 3 つの異なる方法があります: SAX、XSLT、および XML ライブラリ (JDOM、DOM4J、および XOM など - 私は XOM を好みますが、どれも機能します)。
すでに SAX に精通している場合、または他の方法のいずれかが機能したがパフォーマンスが不足している場合は、おそらく SAX の方法が最適です。それを実装する必要がある場合は、xml を取り込んで xml を出力する XMLFilter を作成し、xml を OutputStream に書き込む別の部分の上にそれをスタックし、アンマーシャリングの周りにラッパー メソッドを記述して、受信ストリームをフィードします。 xmlreader を使用して、OutputStream を別の InputStream にコピーし (簡単な方法は commons-io を使用することです)、新しい InputStream を Castor unmarshaller にフィードします。
XSLT を使用すると、SAX にだまされることはありません。XSLT は時々苦労するという評判がありますが、これは比較的簡単な変換のように思えますが、私も試していません。何にでも XSLT を使用するのは久しぶりです。私はそれを手に負えませんが、パフォーマンスについても確信が持てません。
XOM、JDOM、または DOM4J を使用して XML をラップすることも可能で、学習曲線は SAX や XSLT の場合よりもはるかに低くなります。欠点は、XML ドキュメント全体が一度にメモリに吸い込まれる傾向があるため、非常に大きなドキュメントを処理すると、メモリが不足する可能性があることです。