首页 > 解决方案 > 忽略 xmlunit 中的空标签

问题描述

有没有办法完全忽略 XMLUnit 中的空标签,以便在比较时不考虑它?前任:

<a>
<b/>
<c>data1</c>
<d>data2</d>
</a>

<a>
<c>data1</c>
<d>data2</d>
</a>

不应该返回任何差异。是否有任何内置功能可以做到这一点?谢谢你。

标签: javaxmlunit

解决方案


一般来说,空标签与缺失标签不同,这就是 XMLUnit 抱怨的原因。在 XMLUnit 2.x 中,您可以禁止将节点与NodeFilter. NodeFilter是一个谓词函数,它接受单个 DOMNode并返回true在比较文档时是否应考虑该节点。默认实现只返回true所有Node不是文档类型声明的 s。

您可以使用类似以下(未经测试)的类

class SuppressEmptyElements implements Predicate<Node> {
    @Override
    public boolean test(Node n) {
        if (n instanceof Element) {
            return !isEmpty((Element) n);
        }
        // not an element - a commment, nested text and so on
        return true;
    }

    private boolean isEmpty(Element e) {
        return e.getAttributes().getLength() == 0 && e.getChildNodes().getLength() == 0;
    }
}

使用时,DiffBuilder您会使用类似withNodeFilter(new SuppressEmptyElements()). 更长的故事可以在 XMLUnit 的用户指南中找到。


推荐阅读