2015-06-25 75 views
1

我想比较使用XMLUnit的两个XML文件。我希望DetailedDiff不要以不同的顺序报告不同的标签。例如,如果我创建了这两个片段一个DetailedDiff:如何用XMLUnit的DetailedDifference忽略相同元素的顺序?

<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; 
} 

回答

5

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; 
} 

它接受默认设置但降级只是无序的差异。

+0

这是完美的答案。谢谢..但是我需要忽略不存在的节点。因为我不想在结果输出中看到这样的输出:子节点预期存在“null”,但是......我该怎么做?问候。 – limonik

+0

为此,您可以使用相同的方法@limonik - 您想忽略的差异是“CHILD_NODE_NOT_FOUND_ID”,可能是“CHILD_NODELIST_LENGTH_ID”。 –

相关问题