2008-11-09 2 views
9

У меня есть куча модульных тестов, которые должны проверять выходы XML.Лучший способ сравнить 2 XML-документа в .NET

Я начал с сравнения строк, но это не будет масштабироваться, поскольку форматирование и поверхностные различия мешают.

Что является самым простым способом в .NET оценить, является ли сгенерированный XML семантически таким же, как ожидаемый тест?

Закрытое в дубликате How would you compare two XML Documents?

+0

Тот же вопрос [здесь] (http://stackoverflow.com/questions/167946/how-would-you-compare-two-xml-documents). – 2008-11-09 12:01:18

ответ

11

Microsoft предлагает своим XML Diff инструменты/классы here. Я лично не использовал его, но это звучит, как это будет, чтобы вы начали:

«Используя класс XMLDiff, то программист может определить, если два файла на самом деле отличается на основе на условиях, которые являются важными для их применения»

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

5

Это одна из тех проблем, которые кажется, что это будет легко начать w с, но чем больше вы копаете, тем больше глубины вы обнаружите в проблемном пространстве.

Существует множество ранее существовавших инструментов, в которых будет выполняться xml diff - как в графическом интерфейсе (в том же стиле, что и в текстовых инструментах), и в командной строке/компонентах (которые больше того, d после). XMLDiff - один из таких случаев, как уже упоминалось.

Проблемы возникают, когда вы задаете такие вопросы, как - что я хочу, чтобы он выводил? Вам просто нужен код возврата, который говорит, если они одинаковые или разные (для единичных целей тестирования это может быть действительно достаточно) - или вы хотите, чтобы отчет показывал вам, что такое различия? (также может быть полезно для модульных тестов, если вы хотите найти, в чем проблема)? Если последний, как вам нужна эта информация? Вы хотите отредактировать расстояние? Вы хотите, чтобы он интерпретировал числовые значения и рассказал вам разницу между ними?

Как насчет упорядочения узлов? Если дочерние узлы находятся в определенном порядке - или если они являются одними и теми же узлами, но в другом порядке, это нормально?

Возможно, вам также захочется указать, что сравнивать. Должны ли пространства имен совпадать? Является ли пробел значительным в любом месте? Существуют ли определенные узлы, которые вы всегда хотите игнорировать (например, атрибут «время»), или вы хотите, чтобы более тонкий контроль над тем, какие узлы сравниваются, а какие нет?

Для численных сравнений вы хотите разрешить допуски? Для текстовых сравнений (текстовых узлов) пробел в пределах текст значителен? Как насчет капитализации?

И вы можете продолжать и продолжать (как я это сделал в анализе только для такого проекта, где я недавно работал).

Каждый инструмент решает эти проблемы в разной степени и по-разному.

Возможно, вы решите просто сделать это как можно проще и перейти к чему-то, что делает прямое, узлоузел, сравнение без интерпретации, и в конце расскажите, являются ли они одинаковыми или разными. Я считаю, xmldiff даст вам это (и немного больше).

Также стоит подумать, что если вы хотите обрабатывать такие случаи, как разные порядки узлов или игнорировать определенные ветви, вы можете применить преобразование xslt к вашему тестовому документу перед сравнением, чтобы нормализовать его в соответствии с вашими правилами.

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