【问题标题】:XMLUnit expected number of child nodes to be true but was falseXMLUnit 预期的子节点数为真,但为假
【发布时间】:2015-09-06 08:20:12
【问题描述】:

我正在使用 XMLunit 来比较以下 XML 的

XML 1

<element1>
</element1>
<element2>   Some Text  </element2>

XML 2

<element1/>
<element2>Some Text</element2>

我希望只有元素 2 会有所不同,但是对于元素 1,我会得到这样的差异

“预期存在的子节点为真,但为假”。
“预期的子节点数为 1,但为 0”
"预期存在子节点 '#text' 但为空。

我知道 setIgnoreWhiteSpace 可以解决这个问题,但我想要 element2 空白差异。

【问题讨论】:

  • 两个元素实际上在空白方面有所不同 - 为什么您希望 element2 显示差异但不是 element1?

标签: java xml xmlunit


【解决方案1】:

&lt;element1/&gt;&lt;element1&gt;&lt;/element1&gt; 应该返回相同的结果,但是您的标签之间有一个 newline,所以这是一个 1 或 2 个字符的文本节点(取决于换行符是 CR LF 还是只是 LF) .

由于您没有告诉解析器忽略空格,它会为您提供它在源数据中找到的所有内容。由您决定如何处理它。

【讨论】:

    【解决方案2】:

    正如其他人提到的,XMLUnit 将&lt;element1&gt; 内的文本(由一个新行组成)视为一个子节点。其他 XML 中的 &lt;element1> 确实 没有 有任何子节点(甚至没有空文本)。

    如果你想忽略这种差异,你必须编写一个自定义的DifferenceListener

    Diff diff = new Diff(doc1, doc2);
    diff.overrideDifferenceListener(new DifferenceListener() {
    
        ...
    
        @Override
        public int differenceFound(Difference difference) {
            if(difference.getId() == DifferenceConstants.HAS_CHILD_NODES_ID) {
                Node controlNode = difference.getControlNodeDetail().getNode();
                Node testNode = difference.getTestNodeDetail().getNode();
    
                if(controlNode.getChildNodes().getLength() == 0) {
                    Node childNode = testNode.getChildNodes().item(0);
                    // note the trim method call
                    if(childNode.getNodeType() == Node.TEXT_NODE
                              && childNode.getTextContent().trim().isEmpty()) {
                        return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
                    }
                } else { // we're sure the other node has children in the else part
                    Node childNode = controlNode.getChildNodes().item(0);
                    if(childNode.getNodeType() == Node.TEXT_NODE
                              && childNode.getTextContent().trim().isEmpty()) {
                        return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
                    }
                }
            }
            return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
        }
    });
    

    【讨论】:

    • 在这种情况下没有理由自定义DifferenceListener,只需通过XMLUnit.setIgnoreWhitespace(true) 告诉XMLUnit 忽略元素内容空白即可。
    • @StefanBodewig 这也将忽略 OP 不想要的其他差异。
    • 你是对的,我误解了要求 - 现在我和 Jon Skeet 在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2018-11-11
    相关资源
    最近更新 更多