Как игнорировать порядок идентичных элементов с помощью XMLUnit DetailedDifference?
Я хочу сравнить два xml файла с помощью XMLUnit. Я хотел бы, чтобы в Детальдиффе не сообщалось о идентичных тегах в разных заказах как отличия. Например, если я создал DetailDiff с этими двумя фрагментами:
<a><b/><c/></a>
и
<a><c/><b/></a>
ПодробныйDiff создаст две отличия, так как теги 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;
}
Ответы
Ответ 1
RecursiveElementNameAndTextQualifier
даст тот же результат, что и по умолчанию ElementNameQualifier
- b и c не соответствуют порядку, но кроме того, что документы идентичны.
Элементы, которые не соответствуют порядку, представляют собой восстанавливаемую разницу, поэтому Diff
и DetailedDiff
скажут, что документы "схожи", но не "идентичны". Поэтому либо вы игнорируете восстановимые различия, либо вы должны переопределить 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;
}
который принимает значение по умолчанию, но понижает только разницу вне порядка.