如何在使用XMLUnit的DetailedDiff函数时仅检查特定节点而不是所有节点的差异
这是我的代码:
public static void main(String[] args)
{
//URL url1 = xmlunittest.class.getResource("MSHIS1.xml");
// URL url2 = xmlunittest.class.getResource("MSHIS.xml");
Logger L = new Logger();
FileReader fr1 = null;
int countofdifferences = 0;
FileReader fr2 = null;
try {
fr1 = new FileReader("MSHIS.xml");
fr2 = new FileReader("MSHIS1.xml");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
Diff diff = new Diff(fr1, fr2);
L.writeToBVTLOG("Similar? " + diff.similar());
L.writeToBVTLOG("Identical? " + diff.identical());
DetailedDiff detDiff = new DetailedDiff(diff);
List differences = detDiff.getAllDifferences();
for (Object object : differences) {
Difference difference = (Difference)object;
L.writeToBVTLOG("------------------------");
L.writeToBVTLOG(difference.toString());
L.writeToBVTLOG("------------------------");
countofdifferences++;
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
L.writeToBVTLOG(countofdifferences);
}
但问题是,我只想让程序告诉我4个特定节点是否经历过任何更改。那么如何通过列出所有差异来实现目标。
答案 0 :(得分:2)
您可以实现自己忽略某些节点的DifferenceListener(或只关注某些节点),并告诉XMLUnit在检查差异时使用它。这是一个忽略任何名为“myelement”的元素的DifferenceListener:
public class IgnoreMyAttributeElements implements DifferenceListener()
{
@Override
public int differenceFound(Difference differenceIn)
{
Node controlNode = differenceIn.getControlNodeDetail().getNode();
if(controlNode.getNodeType() == Node.ELEMENT_NODE)
{
if(controlNode.getLocalName().equals("myelement");
{
return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
}
}
return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
}
@Override
public void skippedComparison(Node nodeIn, Node nodeIn2)
{
//don't care about these events
}
}
然后将其传递给DetailedDiff:
DetailedDiff diff = new DetailedDiff(XMLUnit.compareXML(oldXml, newXml));
diff.overrideDifferenceListener(new IgnoreMyAttributeElements());
List<?> allDifferences = diff.getAllDifferences();
//do something with differences
答案 1 :(得分:1)
您可以先使用javax.xml.transform.TransformerFactory
转换这两个文档,以便它只包含您感兴趣的节点。或者你可以在差异上使用getControlNodeDetail()和getTestNodeDetail()来查看差异是否适用于你想要的节点。