3

oracle.xml.differ.XMLDiffを使用して、Java で 2 つの XML ドキュメントを比較しようとすると問題が発生します。コードは完全に実装されており、一部のインスタンスで属性の変更が検出されないことを発見するまで、正常に動作することを期待していました. これを実証するために、次のものがあります。

設定:

DOMParser parser = new DOMParser();
parser.setPreserveWhitespace(false);
parser.parse(isCurrent);
XMLDocument currentXmlDoc = parser.getDocument();

parser.parse(isPrior);
XMLDocument priorXmlDoc = parser.getDocument();

XMLDiff xmlDiff = new XMLDiff();
xmlDiff.setDocuments(currentXmlDoc, priorXmlDoc);

最初のケースでは、ストライクでの属性変更がうまくピックアップされます。次の 2 つの XML ファイルがあります。

XML1

<Periods>
   <Period Start="2011-03-28" End="2011-04-17" AverageStart="" AverageEnd="" Notional="6000000.0000" OptionType="Swap" Payment="2011-04-19" Strike="72.0934800" Underlying="ZA" ResetStrike="No" ResetNotional="No" QuotingDate="2011-04-17" Multiplier="1.000000" PlusConstant="0.000000" StopLossPercent="" StopLossLevel=""/>
</Periods>

XML2

<Periods>
   <Period Start="2011-03-28" End="2011-04-17" AverageStart="" AverageEnd="" Notional="6000000.0000" OptionType="Swap" Payment="2011-04-19" Strike="0.0000000" Underlying="ZA" ResetStrike="No" ResetNotional="No" QuotingDate="2011-04-17" Multiplier="1.000000" PlusConstant="0.000000" StopLossPercent="" StopLossLevel=""/>
</Periods>

2番目のケースでは、Strike での属性変更はピックアップされません。次の 2 つの XML ファイルがあります。

XML1

<Periods>
    <Period Start="2011-03-28" End="2011-04-30" Payment="2011-05-02" Notional="5220000.000000" Strike="176.201900" StopLossPercent="" StopLossLevel=""/>
</Periods>

XML2

<Periods>
    <Period Start="2011-03-28" End="2011-04-30" Payment="2011-05-02" Notional="5220000.000000" Strike="0.000000" StopLossPercent="" StopLossLevel=""/>
</Periods>

私が何か間違ったことをしているのか、それとも XMLDiff パッケージにバグがあるのか​​ 誰か知っていますか?

または、順序に関係なく、XML ファイル間のノードと属性の違いを識別するだけで、同じ方法で使用できる別のツールを知っている人はいますか?

ありがとう、ミレーナ

更新:新しい外部パッケージをシステムで使用するために承認されるには非常に時間がかかるため、理想的なケースでは、oracle.xml.differ.XMLDiff を機能させるためのソリューションを見つけたいと考えています。明らかに、本当にバグがあり、これを回避できない場合は、他のツールを検討します。

更新 2: XMLDiff バグについて誰も知らないようですので、提案された XMLUnit パッケージを実装してみます。

4

1 に答える 1

1

単体テストでは、xml コンテンツを比較するためにorg.custommonkey.xmlunit.Diffを使用しています。http://xmlunit.sourceforge.net/api/org/custommonkey/xmlunit/Diff.htmlを参照してください。

私は xml 文字列を比較していますが、xml w3c ドキュメントも比較できます。XMLDocument を org.w3c.dom.Document の String に変換できることを願っています。

私のテストケースは次のようになります。

String actualXML = SomeClass.getElement().asXML();
String expectedXML = IOUtils.toString(this.getClass().getResourceAsStream("/expected.xml"));

org.custommonkey.xmlunit.Diff myDiff = new Diff(StringUtils.deleteWhitespace(expectedXML), StringUtils.deleteWhitespace(actualXML));
assertTrue(MessageFormat.format("XML must be simular: {0}\nActual XML:\n{1}\n", myDiff, actualXML), myDiff.similar());

ps apache commons StringUtils.deleteWhitespace()メソッドも使用します。空白の違いには興味がないからです。

于 2013-04-15T09:21:12.440 に答える