Сравнение XmlDocument - PullRequest
3 голосов
/ 26 июня 2009

Я хочу сравнить документ XML. некоторые 50к +. Я сравниваю OuterXml. это эффективно? есть ли более эффективный способ?

Ответы [ 5 ]

8 голосов
/ 26 июня 2009

Простое сравнение текстового представления вашего XML не даст правильных результатов - проверьте это:

<node x="1" y="2" />

и

<node y="2" x="1" />

идентичны в отношении обработки XML (порядок атрибутов на узле не имеет значения), но когда вы сравниваете только текст, вы помечаете его как разницу.

У Microsoft раньше был инструмент XmlDiff в GotDotNet, но я не уверен, доступен ли он где-нибудь еще .....

UPDATE
XmlDiff, кажется, все еще доступен - проверьте эту ссылку для скачивания , а также ссылку " Использование XML Diff and Patch Tool в вашем приложении " на MSDN.

Марк

4 голосов
/ 26 июня 2009

Зависит от того, какое сравнение вы хотите.

Например, если вы хотите сравнить содержимое двух файлов и получить статус «истина / ложь», я бы предложил использовать XmlReader для каждого из двух файлов, которые вы хотите сравнить, и затем проанализировать узлы. Как только вы обнаружите разницу, вы можете прекратить анализ.

Это отличается от использования XML-документа, когда вам необходимо прочитать весь документ в память, получить строковое представление и сравнить строки. (Для файлов меньшего размера это не имеет значения)

Два XML-документа могут быть семантически эквивалентны, но структура может отличаться. (В этом случае ваше сравнение должно быть умнее).

Если вы намереваетесь изменить исходный документ, в случае, если сравнение не удается или завершается успешно, предпочтительным является способ DOM (класс XmlDocument и его API).

2 голосов
/ 26 июня 2009

Существует также этот проект с открытым исходным кодом: http://diffxml.sourceforge.net/

Я использовал XmlDiff от MicroSoft и этот фреймворк. Я думаю, что MS XmlDiff имеет немного больше функций сравнения, так что теперь я использую это. Но если вам нужен открытый исходный код, DiffXml - это хороший фреймворк.

1 голос
/ 26 июня 2009

Для сравнения файлов XML у меня были проблемы с MS XmlDiff, поэтому я написал гораздо более простой метод сравнения. Я написал простое приложение, которое выберет все элементы, которые имеют атрибуты, поскольку файлы XML, которые мне нужно было сравнить, не сохраняют значения в самом узле элемента. Этот выбор очень прост в XPath: // [@ ]
Я сделал это для обоих документов, таким образом, имея два списка узлов. Затем я изменил эти узлы на строку XPath, рекурсивно пройдя по его родительским узлам и добавив в качестве условий значения attruibute. Таким образом, я получил два списка строк XPath.
Последний шаг проходил по этим спискам, проверяя, есть ли в другом документе узел с данным XPath. Если нет, то это отсутствовало, и я бы знал, какой именно элемент отсутствовал. Этот список отсутствующих узлов был передан в текстовый файл, и поэтому у меня был простой отчет о различиях между двумя документами, игнорируя порядок атрибутов, значения элементов и все элементы без атрибутов. Что было именно то, что мне нужно.

Но если вам нужно более сложное сравнение XML, прочтите другие ответы. : -)

0 голосов
/ 31 августа 2010

Project: Merge - это приложение для Windows, которое может сравнивать (и объединять) файлы XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...