【问题标题】:How do I ignore order of identical elements with XMLUnit's DetailedDifference?如何使用 XMLUnit 的详细差异忽略相同元素的顺序?
【发布时间】:2015-09-12 11:58:47
【问题描述】:

我想使用 XMLUnit 比较两个 xml 文件。我希望DetailedDiff 不会将不同顺序的相同标签报告为差异。例如,如果我用这两个 sn-ps 创建了一个DetailedDiff:

 <a><b/><c/></a>

<a><c/><b/></a>

DetailedDiff 将创建两个差异,因为 b 和 c 标记无序。我已经尝试过覆盖元素限定符,但它不会导致任何更改。我做错了什么还是这不可能用 XMLUnit 做?作为参考,这里是我用来比较两个 xml 文件的代码(不包括 overrideElementQualifier 调用)。

public List<Difference> getDifferenceList(Reader file1, Reader file2) {
    Diff d = new Diff(file1, file2); //I'm passing the args as FileReaders
    d.overrideElementQualifier(new RecursiveElementNameAndTextQualifier());
    detailedDiff = new DetailedDiff(d);
    List<Difference> allDifferences = detailedDiff.getAllDifferences();
    return allDifferences;
}

【问题讨论】:

    标签: java xmlunit


    【解决方案1】:

    RecursiveElementNameAndTextQualifier 将产生与默认 ElementNameQualifier 相同的结果 - b 和 c 无序,但文档相同。

    无序的元素构成可恢复的差异,因此DiffDetailedDiff 会说文档“相似”但不“相同”。因此,要么忽略可恢复的差异,要么必须覆盖 DifferenceListener 而不是 ElementQualifier 以将 CHILD_NODELIST_SEQUENCE_ID 类型的差异从 RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR(默认值)降级为 RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL。类似的东西

    public int differenceFound(Difference difference) {
        return difference.getId() == DifferenceConstants.CHILD_NODELIST_SEQUENCE_ID
            ? RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL
            : RETURN_ACCEPT_DIFFERENCE;
    }
    

    它接受默认值,但只降级无序的差异。

    【讨论】:

    • 这是完美的答案。谢谢.. 但是我需要忽略不存在的节点。由于我不想在结果输出中看到这样的输出:预期存在子节点“null”但是是......我该怎么做?问候。
    • 为此,您可以使用相同的方法@limonik - 您要忽略的区别是CHILD_NODE_NOT_FOUND_ID 和可能CHILD_NODELIST_LENGTH_ID
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2019-05-09
    • 2011-02-10
    • 1970-01-01
    • 2016-08-13
    相关资源
    最近更新 更多