2

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

XML 1

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

XML 2

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

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

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

我知道这可以消失,setIgnoreWhiteSpace但我想要element2空白差异。

4

2 回答 2

2

<element1/>并且<element1></element1>应该返回相同的值,但是您newline的标签之间有一个,所以这是一个 1 或 2 个字符的文本节点(取决于换行符是CR LF还是只是LF)。

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

于 2015-09-06T08:28:03.893 回答
-1

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

如果您想忽略这种差异,则必须编写自定义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;
    }
});
于 2015-09-06T09:05:45.390 回答