How do I ignore order of identical elements with XMLUnit's DetailedDifference?
Asked Answered
F

1

2

I want to compare two xml files using XMLUnit. I would like the DetailedDiff to not report identical tags in different orders as differences. For example, if I created a DetailedDiff with these two snippets:

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

and

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

The DetailedDiff will create two Differences since the b and c tags are out of order. I have tried overriding element qualifiers but it doesn't result in any changes. Am I doing something wrong or is this impossible to do with XMLUnit? For reference here's the code I'm using to compare two xml files (not including overrideElementQualifier calls).

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;
}
Fan answered 25/6, 2015 at 18:15 Comment(0)
L
5

RecursiveElementNameAndTextQualifier will yield the same result as the default ElementNameQualifier - b and c are out of order but other than that the documents are identical.

Elements that are out of order constitute a recoverable difference, so Diff and DetailedDiff will say the documents are "similar" but not "identical". So either you ignore recoverable differences or you must override the DifferenceListener rather than the ElementQualifier to downgrade a difference of type CHILD_NODELIST_SEQUENCE_ID from RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR (the default) to RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL. Something like

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

which accepts the default but downgrades just the out-of-order differences.

Lindie answered 27/6, 2015 at 16:25 Comment(2)
This is perfect answer. Thank you.. However I need to ignore the nodes which are not existent. Since I do not want to see in the result output such a output: Expected presence of child node "null" but was ......How can I do that? Regards.Imitate
For this you can use the same approach @Imitate - the difference you want to ignore is CHILD_NODE_NOT_FOUND_ID and probably CHILD_NODELIST_LENGTH_ID.Lindie

© 2022 - 2024 — McMap. All rights reserved.