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

kyxcudwk  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(494)

我有两个xml需要与不同的相似xml集进行比较,在比较时,我需要忽略基于某个条件的标记,例如
personal.xml-忽略全名
address.xml-igone zipcode
contact.xml-忽略家庭电话
这是密码

Diff documentDiff=DiffBuilder
                    .compare(actualxmlfile)
                    .withTest(expectedxmlfile)
                    .withNodeFilter(node -> !node.getNodeName().equals("FullName"))                     
                    .ignoreWhitespace()
                    .build();

如何在“.withnodefilter(node->)”中添加条件!node.getnodename().equals(“fullname”))“或者有更聪明的方法来实现这一点吗

pprl5pva

pprl5pva1#

可以使用“and”将多个条件连接在一起( && ):

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 对象,使用不同的过滤器。这可能会导致代码更清晰。

相关问题