【问题标题】:Ignore empty tags in xmlunit忽略 xmlunit 中的空标签
【发布时间】:2018-11-26 22:45:29
【问题描述】:

有什么方法可以完全忽略 XMLUnit 中的空标签,以便在比较时不考虑它? 例如:

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

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

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

【问题讨论】:

  • 我认为应该完全忽略空标签(无属性或内容),除非它们的存在是通过模式明确强制的
  • @NitinSingh 它给出的区别是:预期元素标签名称为'b'但为'c',然后将c标签与d标签进行比较。
  • 您可以使用NodeFilter 来抑制所有空元素。一般来说,空元素肯定与没有元素完全不同,例如,想想 HTML 页面上空的hr 标记的效果。
  • @StefanBodewig 谢谢。但我是 XMLunit 的新手,无法找到 NodeFilter 的文档,也无法实现它。你能帮忙吗?谢谢。
  • 我创建了一个答案,因为回复会变得太长而无法发表评论。 :-)

标签: java xmlunit


【解决方案1】:

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

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

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 的user guide 中找到。

【讨论】:

  • 谢谢。这很有用。但是我现在遇到运行时错误。我不确定这是否与 XMLUnit 有关,但如果您能看一看,那就太好了! Exception in thread "main" javax.xml.bind.DataBindingException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.io.BufferedReader does not have a no-arg default constructor. this problem is related to the following location: at java.io.BufferedReader
  • 由于一条评论无法发完整个错误,我再发一次:Exception in thread "main" javax.xml.bind.DataBindingException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.io.BufferedReader does not have a no-arg default constructor. this problem is related to the following location: at java.io.BufferedReader at org.xmlunit.builder.JaxbBuilder.build(JaxbBuilder.java:93) at org.xmlunit.builder.DiffBuilder.getSource(DiffBuilder.java:134) at org.xmlunit.builder.DiffBuilder.compare(DiffBuilder.java:119)
  • 如果您在github.com/xmlunit/xmlunit/issues 打开错误报告并尝试添加一个重现问题的小测试用例,这可能会更容易。
  • 这个解决方案对我不起作用,因为它过滤掉了控制 XML 有一个空节点的情况(所以它被过滤了),但测试 XML 有相同的节点不为空
  • 像魅力一样工作。使用无变化。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多