2015-06-25 5 views
1

Я хочу сравнить два xml-файла с помощью XMLUnit. Я хотел бы, чтобы в Детальдиффе не сообщалось о идентичных тегах в разных заказах как отличия. Например, если я создал DetailedDiff с этими двумя отрывками:Как игнорировать порядок идентичных элементов с помощью детального разбора XMLUnit?

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

и

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

The DetailedDiff создаст два отличия с момента в Ь и с бирками неисправны. Я попытался переопределить квалификаторы элементов, но это не приводит к каким-либо изменениям. Я что-то делаю неправильно или это невозможно сделать с 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 - Ь и с не по порядку, но кроме того, что документы являются идентичными.

Элементы, которые не соответствуют требованиям, являются возмещаемой разницей, поэтому 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; 
} 

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

+0

Это прекрасный ответ. Спасибо. Однако мне нужно игнорировать узлы, которые не существуют. Так как я не хочу видеть в результате выход такой вывод: ожидаемое присутствие дочернего узла «null», но было ...... Как я могу это сделать? С уважением. – limonik

+0

Для этого вы можете использовать тот же подход @limonik - разница, которую вы хотите игнорировать, это 'CHILD_NODE_NOT_FOUND_ID' и, вероятно,' CHILD_NODELIST_LENGTH_ID'. –

Смежные вопросы