質問

JAXBコンパイラによって生成された.javaファイルの属性の順序を制御したいと思います。

属性の順序はxml検証にとって重要ではないことを認識しています。順序は、リグレッションテスト環境でマーシャリングされたxmlのテキスト比較に重要です。ファイル内の属性の順序は、マーシャリングされたxmlタグ内の属性の順序に直接影響します。

JAXBコンパイラが実行されるたびに、スキーマに変更を加えなくても、属性グループは異なる順序で表示されます。この動作を防ぐ明確なオプションはコンパイラで利用できません。

属性グループが分割されるため、生成された.javaファイル内の属性をアルファベット順に並べ替えるために、コンパイル後スクリプトを実行したくないのですが、別のオプションがあるかどうかはわかりません。

どんな提案でも大歓迎です。

ありがとう、 デイブ

役に立ちましたか?

解決 4

このスレッドは、私の問題に対する優れたソリューションを提供します。

XSLを使用して属性をソートする

回答の1つには、属性を並べ替えるだけのxsl変換が含まれています。少し遅ければ完璧に動作します。

他のヒント

どうやら、JAXB 2.0ではアノテーション@XmlAccessorOrderまたは@XmlType(propOrder =)

を使用できます

テキスト比較を行う代わりに、XMLパーサーを使用して出力を検証することをお勧めします。とにかくxmlを解析して並べ替える場合は、XMLツールを使用して比較することもできます。

編集: Javaソースコードの順序を操作して、生成されたXMLを制御しようとすることは、脆弱な方法のように思えます。確かに、これはテスト専用であるため、何かが壊れてもコードは適切に動作する可能性があります。人々はソースコードの順序を常に、時には偶然に変更します。特定の順序に頼らなければならない場合、それは迷惑な、または微妙な問題の原因になります。

XMLツールを使用してXMLデータを比較する方法については、これを個人的に大規模に行ったことはありませんが、このリンクにはいくつかの無料ツールが記載されています。私にとって、XML関連のアサーションを提供するJUnitの拡張は、既存のテストとうまく統合できる最初のステップです。それ以外の場合、主に正確な等価性を探しているため、2つのXMLファイルを解析し、「期待される」ファイルのノードを反復処理して、それらのノードが「実際の」ファイルに存在するかどうかを確認できます。次に、表示されると思わない他のノードを確認します。

XMLドキュメントのテキスト比較を実行する必要がある場合、属性の順序を区別しないXMLフレームワークの出力を制御しようとするよりも、より良い方法があります。

たとえば、 XMLUnit があります。これは、XMLアサーション専用のjunit拡張機能であり、空白を処理しますそして非常にうまく注文。

より一般的な解決策は、 XOMの Canonicalizer 。属性の順序と空白が予測可能なXML DOMを出力します。非常に便利です。

そう... JAXB(または何でも)が適切と思われるXMLを生成し、XMLUnitまたはXOMを介して出力を実行し、比較します。これには、JAXBに依存しないという追加の利点があり、生成されたXMLで動作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top