Если я хочу сравнить содержание XMlDocument, это точно так же, как это?
XmlDocument doc1 = GetDoc1();
XmlDocument doc2 = GetDoc2();
if(doc1 == doc2)
{
}
Я не проверяю, являются ли они оба той же ссылкой на объект, но если СОДЕРЖАНИЕ xml является тем же.
No. XmlDocument не отменяет поведение метода Equals ()
, поэтому на самом деле он просто выполняет ссылочное равенство - что в вашем примере не удастся, если только документы не являются одним и тем же экземпляром объекта.
Если вы хотите сравнить содержимое (атрибуты, элементы, комментарии, PI и т. Д.) Документа, вам придется реализовать эту логику самостоятельно. Предупреждаем: это нетривиально.
В зависимости от вашего конкретного сценария, вы можете удалить все несущественные пробелы из документа (что само по себе может быть непросто) и сравнить полученный текст xml. Это не идеально - это не подходит для документов, которые семантически идентичны, но отличаются такими вещами, как использование и объявление пространств имен, экранирование определенных значений, порядок элементов и т. Д. Как я уже говорил, сравнение XML нетривиально.
Вам также необходимо четко определить, что означает «идентичность» двух XML-документов. Имеет ли значение порядок элементов или атрибутов? Имеет ли значение регистр (в текстовых узлах)? Стоит ли игнорировать лишние разделы CDATA? Учитываются ли инструкции по обработке? А как насчет полностью квалифицированного vs.частично определенные пространства имен?
В любой реализации общего назначения вы, вероятно, захотите преобразовать оба документа в некоторую каноническую форму (будь то XML или другое представление), а затем сравнить каноническое содержимое.
Уже существуют инструменты, выполняющие различие XML, например Microsoft XML Diff / Patch , , вы можете использовать их для выявления различий между двумя документами. Насколько мне известно, этот инструмент не распространяется в исходной форме ... поэтому, чтобы использовать его во встроенном приложении, вам потребуется сценарий процесса (если вы планируете его использовать, вы должны сначала убедиться, что условия лицензирования разрешают его использование и распространение. ).
РЕДАКТИРОВАТЬ: Посмотрите ответ @Max Toro , если вы используете .NET 3.5 SP1, поскольку, по-видимому, в XLinq есть опция, которая может быть полезна. Приятно знать, что он существует.
Попробуйте метод DeepEquals в API XLinq.
XDocument doc1 = GetDoc1();
XDocument doc2 = GetDoc2();
if(XNode.DeepEquals(doc1, doc2))
{
}
См. Также Семантика равенства LINQ to XML Trees
Л.Бушкин прав, это нетривиально. Поскольку XML - это строковые данные, вы можете технически выполнить хэш содержимого и сравнить их, но на это будут влиять такие вещи, как пробелы.
Вы можете провести структурированное сравнение (также называемое «XML-диаграммой») между двумя документами и сравнить результаты. Так, например, наборы данных .NET отслеживают изменения.
В остальном вам придется перебирать DOM и сравнивать элементы, атрибуты и значения друг с другом. Если задействована схема, вам также придется учитывать позиции и так далее.