Сравнение XmlDocument для равенства (мудрое содержание)

Если я хочу сравнить содержание XMlDocument, это точно так же, как это?

XmlDocument doc1 = GetDoc1();
XmlDocument doc2 = GetDoc2();

if(doc1 == doc2)
{

}

Я не проверяю, являются ли они оба той же ссылкой на объект, но если СОДЕРЖАНИЕ xml является тем же.

14
задан Blankman 27 May 2010 в 19:46
поделиться

3 ответа

No. XmlDocument не отменяет поведение метода Equals () , поэтому на самом деле он просто выполняет ссылочное равенство - что в вашем примере не удастся, если только документы не являются одним и тем же экземпляром объекта.

Если вы хотите сравнить содержимое (атрибуты, элементы, комментарии, PI и т. Д.) Документа, вам придется реализовать эту логику самостоятельно. Предупреждаем: это нетривиально.

В зависимости от вашего конкретного сценария, вы можете удалить все несущественные пробелы из документа (что само по себе может быть непросто) и сравнить полученный текст xml. Это не идеально - это не подходит для документов, которые семантически идентичны, но отличаются такими вещами, как использование и объявление пространств имен, экранирование определенных значений, порядок элементов и т. Д. Как я уже говорил, сравнение XML нетривиально.

Вам также необходимо четко определить, что означает «идентичность» двух XML-документов. Имеет ли значение порядок элементов или атрибутов? Имеет ли значение регистр (в текстовых узлах)? Стоит ли игнорировать лишние разделы CDATA? Учитываются ли инструкции по обработке? А как насчет полностью квалифицированного vs.частично определенные пространства имен?

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

Уже существуют инструменты, выполняющие различие XML, например Microsoft XML Diff / Patch , , вы можете использовать их для выявления различий между двумя документами. Насколько мне известно, этот инструмент не распространяется в исходной форме ... поэтому, чтобы использовать его во встроенном приложении, вам потребуется сценарий процесса (если вы планируете его использовать, вы должны сначала убедиться, что условия лицензирования разрешают его использование и распространение. ).

РЕДАКТИРОВАТЬ: Посмотрите ответ @Max Toro , если вы используете .NET 3.5 SP1, поскольку, по-видимому, в XLinq есть опция, которая может быть полезна. Приятно знать, что он существует.

11
ответ дан 1 December 2019 в 06:08
поделиться

Попробуйте метод DeepEquals в API XLinq.

XDocument doc1 = GetDoc1(); 
XDocument doc2 = GetDoc2(); 

if(XNode.DeepEquals(doc1, doc2)) 
{ 

} 

См. Также Семантика равенства LINQ to XML Trees

34
ответ дан 1 December 2019 в 06:08
поделиться

Л.Бушкин прав, это нетривиально. Поскольку XML - это строковые данные, вы можете технически выполнить хэш содержимого и сравнить их, но на это будут влиять такие вещи, как пробелы.

Вы можете провести структурированное сравнение (также называемое «XML-диаграммой») между двумя документами и сравнить результаты. Так, например, наборы данных .NET отслеживают изменения.

В остальном вам придется перебирать DOM и сравнивать элементы, атрибуты и значения друг с другом. Если задействована схема, вам также придется учитывать позиции и так далее.

0
ответ дан 1 December 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: