Java 忽略xmlunit中的空标记

Java 忽略xmlunit中的空标记,java,xmlunit,Java,Xmlunit,有没有办法完全忽略XMLUnit中的空标记,以便在比较时不考虑它? 例: 数据1 数据2 及 数据1 数据2 不应返回任何差异。 是否有任何内置函数用于执行此操作? 谢谢。一般来说,空标记与丢失的标记不同,这就是XMLUnit抱怨的原因。在XMLUnit 2.x中,可以使用NodeFilter抑制节点的比较NodeFilter是一个谓词函数,它接受单个DOMNode并返回true,前提是在比较文档时应考虑该节点。对于所有不是文档类型声明的节点,默认实现只返回true 您可以使用如下(未测

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


数据1
数据2


数据1
数据2
不应返回任何差异。 是否有任何内置函数用于执行此操作?
谢谢。

一般来说,空标记与丢失的标记不同,这就是XMLUnit抱怨的原因。在XMLUnit 2.x中,可以使用
NodeFilter
抑制节点的比较
NodeFilter
是一个谓词函数,它接受单个DOM
Node
并返回
true
,前提是在比较文档时应考虑该节点。对于所有不是文档类型声明的
节点
,默认实现只返回
true

您可以使用如下(未测试)类

类SuppressEmptyElements实现谓词{
@凌驾
公共布尔测试(节点n){
if(元素的n个实例){
return!isEmpty((元素)n);
}
//不是一个元素—一个逗号、嵌套文本等
返回true;
}
私有布尔值为空(元素e){
返回e.getAttributes().getLength()==0和e.getChildNodes().getLength()==0;
}
}

当使用
DiffBuilder
时,您会使用类似于
的nodefilter(newsuppressEmptyElements())
。更长的故事可以在XMLUnit中找到。

我认为应该完全忽略空标记(没有属性或内容),除非他们的出席是通过schema@NitinSingh它给出的区别是:预期的元素标记名为“b”,但为“c”,然后将c标记与d标记进行比较。您可以使用
NodeFilter
来抑制所有空元素。一般来说,空元素肯定与无元素完全不同,例如,想象一下HTML页面上的空
hr
标记的效果。@StefanBodewig谢谢。但我是XMLunit新手,无法找到NodeFilter的文档,也无法实现它。你能帮我做同样的事情吗?谢谢。我创建了一个答案,因为回复太长,无法发表评论。:-)非常感谢。这是有用的。但是我现在得到一个运行时错误。我不确定这是否与XMLUnit有关,但如果您能看一下,那就太好了<代码>线程“main”javax.xml.bind.DataBindingException中的异常:com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:1个IllegalAnnotationExceptions计数java.io.BufferedReader没有无参数默认构造函数。此问题与以下位置有关:在java.io.BufferedReader处,由于无法在一条注释中发布整个错误,我将再次发布它:
线程“main”中的异常javax.xml.bind.DataBindingException:com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:1个IllegalAnnotationExceptions计数java.io.BufferedReader没有无参数默认构造函数。此问题与以下位置有关:org.xmlunit.builder.JaxbBuilder.build(JaxbBuilder.java:93)的java.io.BufferedReader,org.xmlunit.builder.DiffBuilder.getSource(DiffBuilder.java:134)的org.xmlunit.builder.DiffBuilder.compare(DiffBuilder.java:119)
如果您在上打开一个bug报告并尝试添加一个小测试用例来重现问题,可能会更容易。这个解决方案对我不起作用,因为它过滤掉了控件XML有一个空节点的情况(因此它会被过滤),但测试XML有相同的节点,而不是像符咒一样空。使用时不进行更改。谢谢
<a>
<b/>
<c>data1</c>
<d>data2</d>
</a>
<a>
<c>data1</c>
<d>data2</d>
</a>
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;
    }
}