使用oracle.xml.differ.XMLDiff比较Java中的XML文档的问题

时间:2013-04-12 15:32:48

标签: java xml oracle

我在尝试使用 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包,它应该可以解决问题。

1 个答案:

答案 0 :(得分: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。

我的测试用例看起来像这样:

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

P.S。我还使用apache commons StringUtils.deleteWhitespace()方法,因为我对空白区别不感兴趣。