XMLUnit-比较xml并根据条件忽略几个标记



我有几个xml需要与不同的相似xml集进行比较,在进行比较时,我需要忽略基于条件的标记,例如

  1. personal.xml-忽略全名
  2. address.xml-igone邮编
  3. 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

最新更新