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);

在第一种情况下, Strike的属性变化很好。我有以下 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>

第二种情况,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

在单元测试中,我使用org.custommonkey.xmlunit.Diff来比较 xml 内容。见http://xmlunit.sourceforge.net/api/org/custommonkey/xmlunit/Diff.html

我正在比较 xml 字符串,但您也可以比较 xml w3c 文档。我希望您可以将您的 XMLDocument 转换为 org.w3c.dom.Document 的字符串。

我的测试用例如下所示:

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 回答