Сравнение XmlDocument на равенство (по содержанию) - PullRequest
14 голосов
/ 27 мая 2010

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

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

if(doc1 == doc2)
{

}

Я не проверяю, относятся ли они к одной и той же ссылке на объект, но если содержимое XML одинаково.

Ответы [ 5 ]

34 голосов
/ 27 мая 2010

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

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

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

} 

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

11 голосов
/ 27 мая 2010

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

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

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

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

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

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

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

9 голосов
/ 07 августа 2012

Простой способ можно сравнить OuterXml.

var a = new XmlDocument();
var b = new XmlDocument();

a.LoadXml("<root  foo='bar'  />");
b.LoadXml("<root foo='bar'/>");

Debug.Assert(a.OuterXml == b.OuterXml);
0 голосов
/ 10 сентября 2018

Часто требуется сравнить строки XML, упорядоченные по-разному. Это можно легко сделать с помощью этого кода

class Testing
{
    [Test]
    public void Test()
    {
        Assert.AreEqual(
            "<root><a></a><b></b></root>".SortXml()
            , "<root><b></b><a></a></root>".SortXml());
    }
}

public static class XmlCompareExtension
{
    public static string SortXml(this string @this)
    {
        var xdoc = XDocument.Parse(@this);

        SortXml(xdoc);

        return xdoc.ToString();
    }

    private static void SortXml(XContainer parent)
    {
        var elements = parent.Elements()
            .OrderBy(e => e.Name.LocalName)
            .ToArray();

        Array.ForEach(elements, e => e.Remove());

        foreach (var element in elements)
        {
            parent.Add(element);
            SortXml(element);
        }
    }
}
0 голосов
/ 27 мая 2010

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

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

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

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