Как игнорировать порядок идентичных элементов с помощью DetailedDifference XMLUnit?

Я хочу сравнить два файла xml с помощью XMLUnit. Я бы хотел, чтобы DetailedDiff не сообщал об идентичных тегах в разных порядках как о различиях. Например, если я создал 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;
}

person user3599828    schedule 25.06.2015    source источник


Ответы (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;
}

который принимает значение по умолчанию, но понижает только различия вне порядка.

person Stefan Bodewig    schedule 27.06.2015
comment
Это идеальный ответ. Спасибо .. Однако мне нужно игнорировать несуществующие узлы. Так как я не хочу видеть в выводе результата такой вывод: Ожидалось наличие дочернего узла null, но было ...... Как я могу это сделать? С уважением. - person limonik; 20.12.2016
comment
Для этого вы можете использовать тот же подход @limonik - разница, которую вы хотите игнорировать, это CHILD_NODE_NOT_FOUND_ID и, возможно, CHILD_NODELIST_LENGTH_ID. - person Stefan Bodewig; 21.12.2016