Сравнение XML в C # - PullRequest
       15

Сравнение XML в C #

13 голосов
/ 27 апреля 2009

Я пытаюсь сравнить два XML-файла, используя код C #. Я хочу игнорировать различия синтаксиса Xml (то есть имена префиксов). Для этого я использую Microsoft XML Diff and Patch C # API. Он работает для некоторых XML, но я не смог найти способ настроить его для работы со следующими двумя XML:

XML A:

<root xmlns:ns="http://myNs">
  <ns:child>1</ns:child>
</root>

XML B:

<root>
  <child xmlns="http://myNs">1</child>
</root>

Мои вопросы:

  1. Прав ли я, что эти два XML семантически равны (или изоморфны)?
  2. Можно ли настроить Microsoft Diff and Patch API для его поддержки?
  3. Существуют ли другие C # утилиты для этого?

Ответы [ 5 ]

10 голосов
/ 28 апреля 2009

Документы изоморфны, как показано в программе ниже. Я думаю, если вы используете XmlDiffOptions.IgnoreNamespaces и XmlDiffOptions.IgnorePrefixes для настройки Microsoft.XmlDiffPatch.XmlDiff, вы получите желаемый результат.

using System.Linq;
using System.Xml.Linq;
namespace SO_794331
{
    class Program
    {
        static void Main(string[] args)
        {
            var docA = XDocument.Parse(
                @"<root xmlns:ns=""http://myNs""><ns:child>1</ns:child></root>");
            var docB = XDocument.Parse(
                @"<root><child xmlns=""http://myNs"">1</child></root>");

            var rootNameA = docA.Root.Name;
            var rootNameB = docB.Root.Name;
            var equalRootNames = rootNameB.Equals(rootNameA);

            var descendantsA = docA.Root.Descendants();
            var descendantsB = docB.Root.Descendants();
            for (int i = 0; i < descendantsA.Count(); i++)
            {
                var descendantA = descendantsA.ElementAt(i);
                var descendantB = descendantsB.ElementAt(i);
                var equalChildNames = descendantA.Name.Equals(descendantB.Name);

                var valueA = descendantA.Value;
                var valueB = descendantB.Value;
                var equalValues = valueA.Equals(valueB);
            }
        }
    }
}
2 голосов
/ 28 апреля 2009

У меня есть ответ Мартина Хоннена на XML и форуме .NET Framework MSDN. Короче говоря, он предлагает использовать функцию глубокого равенства XQuery 1.0 и предлагает несколько реализаций C #. Кажется, работает.

2 голосов
/ 27 апреля 2009

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

1 голос
/ 27 апреля 2009

Может быть, стоит загрузить экземпляры XmlDocument из каждого XML-файла и вместо этого сравнить XML DOM? Обеспечение правильной проверки проводится для каждого, что должно дать вам общую основу для сравнения и должно позволять стандартную отчетность о различиях. Возможно даже возможность обновлять одно из другого с помощью дельты.

0 голосов
/ 27 апреля 2009

Эти документы не являются семантически эквивалентными. Элемент верхнего уровня первого находится в пространстве имен http://myNS, а элемент второго уровня находится в пространстве имен по умолчанию.

Элементы child двух документов эквивалентны. Но сами документы не являются.

Edit:

Существует разница между xmls:ns='http://myNS' и xmlns='http://myNS', которую я, похоже, упустил из виду. В любом случае, эти документы семантически эквивалентны, и я просто ошибаюсь.

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