Java 如何比较2个XML文件以及如何使用XMLUnit获取新添加\删除的元素等信息
我有两个结构几乎相似的xml文件,在这些xml文件中如何获取以下信息Java 如何比较2个XML文件以及如何使用XMLUnit获取新添加\删除的元素等信息,java,xml,xml-parsing,xmlunit,Java,Xml,Xml Parsing,Xmlunit,我有两个结构几乎相似的xml文件,在这些xml文件中如何获取以下信息 新添加的控件(或节点) 移除并删除控件(或节点) 控件(或节点)属性已修改 为了向您提供信息,我尝试了以下代码: File f1 = new File(inputXMLPath); File f2= new File(outputXMLPath); FileReader fr1 = null; FileReader fr2 = null; try { fr1 = new
File f1 = new File(inputXMLPath);
File f2= new File(outputXMLPath);
FileReader fr1 = null;
FileReader fr2 = null;
try {
fr1 = new FileReader(f1);
fr2 = new FileReader(f2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
Diff diff = new Diff(fr1, fr2);
System.out.println("Similar? " + diff.similar());
System.out.println("Identical? " + diff.identical());
DetailedDiff detDiff = new DetailedDiff(diff);
detDiff.overrideDifferenceListener(new DifferenceListener() {
@Override
public int differenceFound(Difference diff) {
if (diff.getId() == DifferenceConstants.CHILD_NODELIST_SEQUENCE_ID
|| diff.getId() == DifferenceConstants.CHILD_NODELIST_LENGTH_ID) {
return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
}
return RETURN_ACCEPT_DIFFERENCE;
}
@Override
public void skippedComparison(Node arg0, Node arg1) { }
});
List differences = detDiff.getAllDifferences();
for (Object object : differences) {
Difference difference = (Difference)object;
System.out.println("***********************");
System.out.println(difference);
System.out.println("***********************");
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
[编辑:添加了关于
setCompareUnmatched
和示例代码的注释]
我想您应该对未找到的子节点差异做出反应,如果使用XMLUnit.setCompareUnmatched(false)
,XMLUnit 1.x将发出这些差异
如果差异的控制节点为空,则添加该节点-如果测试节点为空,则删除该节点。任何其他区别都是对XMLUnit认为存在于任意一侧的节点的更改
比如说
FileReader fr1 = new FileReader(f1);
FileReader fr2 = new FileReader(f2);
XMLUnit.setCompareUnmatched(false);
Diff diff = new Diff(fr1, fr2);
System.out.println("Similar? " + diff.similar());
System.out.println("Identical? " + diff.identical());
DetailedDiff detDiff = new DetailedDiff(diff);
detDiff.overrideDifferenceListener(new DifferenceListener() {
@Override
public int differenceFound(Difference diff) {
if (diff.getId() == DifferenceConstants.CHILD_NODELIST_SEQUENCE_ID
|| diff.getId() == DifferenceConstants.CHILD_NODELIST_LENGTH_ID) {
return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
}
return RETURN_ACCEPT_DIFFERENCE;
}
@Override
public void skippedComparison(Node arg0, Node arg1) { }
});
List differences = detDiff.getAllDifferences();
for (Object object : differences) {
Difference difference = (Difference)object;
System.out.println("***********************");
if (difference.getId() == DifferenceConstants.CHILD_NODE_NOT_FOUND_ID) {
if (difference.getControlNodeDetail().getNode() == null) {
System.out.println("Node was added");
} else {
System.out.println("Node was removed");
}
}
System.out.println("***********************");
}
会导致类似的结果
***********************
Expected presence of child node 'baz' but was 'null' - comparing <baz...> at /foo[1]/baz[1] to at null
Node was removed
***********************
***********************
Expected presence of child node 'null' but was 'xyzzy' - comparing at null to <xyzzy...> at /foo[1]/xyzzy[1]
Node was added
***********************
***********************
应存在子节点“baz”,但为“null”-将at/foo[1]/baz[1]与at null进行比较
节点被删除
***********************
***********************
应存在子节点“null”,但为“xyzy”-将null处的值与/foo[1]/xyzy[1]处的值进行比较
已添加节点
***********************
检查他们的控件新添加/删除的信息不是第一个xml文件。它总是盲目地比较内容,而我编写的代码(或XMLUnit API)没有像新添加/删除的节点等那样进行出色的比较。请您帮助我完成这项工作。非常感谢您的建议@SuperBiasedMan:我已经发布了代码。。你能给我一个建议吗?谢谢你的回答。。你能用任何示例代码来说明吗。这样我才能更好地理解。有一件事我忘了明确提到,Ragu,那就是setCompareUnmatched
方法,您需要它来帮助我们绕过XMLUnit1的默认行为。谢谢您的回答。粘贴代码后。我在比较过程中遇到了一些问题。添加\删除的节点信息似乎不正确。我已在下面的链接:[link]()中上载了2个xml文件(用于比较),您可以看到XMLUnit显示的结果(已添加\删除的节点)似乎不正确。Stefan:我是否需要做任何其他事情(如实现任何接口…)解决比较过程中的此类问题。