我有几个xml需要与不同的相似xml集进行比较,在进行比较时,我需要忽略基于条件的标记,例如
- personal.xml-忽略全名
- address.xml-igone邮编
- contact.xml-忽略家庭电话
这是代码
Diff documentDiff=DiffBuilder
.compare(actualxmlfile)
.withTest(expectedxmlfile)
.withNodeFilter(node -> !node.getNodeName().equals("FullName"))
.ignoreWhitespace()
.build();
如何在"处添加条件。withNodeFilter(node->!node.getNodeName((.equals("FullName"(("或者有更聪明的方法来做这个吗
您可以使用"以及";(&&
(:
private static void doDemo1(File actual, File expected) {
Diff docDiff = DiffBuilder
.compare(actual)
.withTest(expected)
.withNodeFilter(
node -> !node.getNodeName().equals("FullName")
&& !node.getNodeName().equals("ZipCode")
&& !node.getNodeName().equals("HomePhone")
)
.ignoreWhitespace()
.build();
System.out.println(docDiff.toString());
}
如果你想保持构建器的整洁,你可以将节点过滤器移动到一个单独的方法:
private static void doDemo2(File actual, File expected) {
Diff docDiff = DiffBuilder
.compare(actual)
.withTest(expected)
.withNodeFilter(node -> testNode(node))
.ignoreWhitespace()
.build();
System.out.println(docDiff.toString());
}
private static boolean testNode(Node node) {
return !node.getNodeName().equals("FullName")
&& !node.getNodeName().equals("ZipCode")
&& !node.getNodeName().equals("HomePhone");
}
这样做的风险在于,元素名称可能出现在一种以上类型的文件中,其中该节点需要从一种类型的文件筛选出来,但不能从任何其他类型的文件过滤出来。
在这种情况下,您还需要考虑正在处理的文件类型。例如,您可以使用文件名(如果它们遵循适当的命名约定(或根元素(假设它们不同(,例如<Personal>
、<Address>
、<Contact>
,或者根据您的情况使用它们。
但是,如果您需要区分XML文件类型,出于这个原因,您最好使用这些信息来拥有单独的DiffBuilder
对象,并使用不同的过滤器。这可能会产生更清晰的代码。
我在下面的链接中为提供了单独的方法!node.getNodeName((.equals("FullName"((您在代码中使用的(,我认为通过使用该单独的方法,您可以直接传递要忽略的节点数组并查看结果。如果你想根据自己的要求添加任何其他条件,你可以尝试使用这种方法。
https://stackoverflow.com/a/68099435/13451711