Как сравнить XML-файлы в C #?

#c# #xml #compare

#c# #xml #Сравнить

Вопрос:

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

Я ищу какой-нибудь класс, библиотеку или API, который поможет мне выполнить эту задачу. Можете ли вы предложить какие-то решения?

И все же, я не знаю, должен ли я использовать DOM или Xpath. Есть предложения?

Редактировать:

Хорошо, итак, я пытался выполнить эту задачу с помощью инструмента XmlDiff, но это довольно проблематично решить для нескольких Xml-файлов — я понятия не имею, как я могу использовать эту XmlDiffDiagram, чтобы разобраться в различиях, например, между 50 Xml-файлами.

Будет ли лучше с LINQ?

Ответ №1:

XML Diff и Patch API от Microsoft должны работать нормально:

 public void GenerateDiffGram(string originalFile, string finalFile,
                       XmlWriter diffGramWriter)
    {
        XmlDiff xmldiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder |
                                      XmlDiffOptions.IgnoreNamespaces |
                                      XmlDiffOptions.IgnorePrefixes);
        bool bIdentical = xmldiff.Compare(originalFile, finalFile, false, diffGramWriter);
        diffGramWriter.Close();
    }
  

При необходимости вы также можете использовать инструмент исправления, чтобы сравнить файлы и объединить их:

 public void PatchUp(string originalFile, string diffGramFile, string outputFile)
    {
        XmlDocument sourceDoc = new XmlDocument(new NameTable());
        sourceDoc.Load(originalFile);

        using (var reader = XmlReader.Create(diffGramFile))
        {
            XmlPatch xmlPatch = new XmlPatch();
            xmlPatch.Patch(sourceDoc, reader);

            using (var writer = XmlWriter.Create(outputFile))
            {
                sourceDoc.Save(writer);
                writer.Close();
            }
            reader.Close();
        }
    }
  

Комментарии:

1. Хорошо, итак, я прочитал несколько статей об этом и некоторую документацию, но я думаю, что это хорошее решение для сравнения двух документов. Как насчет сравнения многих из них и их обобщения (сообщения) различий?

2. Как вы планируете это отображать? Похоже, что для этого потребуется совсем немного работы.

3. Задача состоит в том, чтобы выполнить 1) сравнение двух XML-файлов и 2) сравнение нескольких файлов. Во 2) Я должен отобразить, например, диапазоны чисел (возможно, среднее) и, возможно, отклонения от среднего (если, например, во всех файлах, кроме одного, будет одинаковое значение) и вариации в строках (я пока не знаю, как это сделать). Пользователь сможет выбрать XML-файлы из базы данных для сравнения.

4. -1: Я уверен, что это скопированный пример, но не могли бы вы, пожалуйста, 1) использовать XmlReader.Create вместо new XmlTextWriter и 2) поместить using блоки вокруг этих XmlReader экземпляров. Затем я буду голосовать за.

5. ссылка для скачивания на веб-сайте Microsoft не работает: (

Ответ №2:

Если вы хотите просто сравнить XML-файлы и вам не нужно выяснять, в чем разница, вы можете использовать XNode.Метод DeepEquals:

 var xmlTree1 = new XElement("Root",
    new XAttribute("Att1", 1),
    new XAttribute("Att2", 2),
    new XElement("Child1", 1),
    new XElement("Child2", "some content")
);
var xmlTree2 = new XElement("Root",
    new XAttribute("Att1", 1),
    new XAttribute("Att2", 2),
    new XElement("Child1", 1),
    new XElement("Child2", "some content")
);
Console.WriteLine(XNode.DeepEquals(xmlTree1, xmlTree2));
  

Комментарии:

1. К сожалению, XNode. DeepEquals возвращает false, если порядок атрибутов не совпадает, попробуйте заменить порядок Att1 и Att2 для второго дерева

Ответ №3:

Лично я бы выбрал LINQ для XML. Вы можете найти хороший учебник по адресу:http://msdn.microsoft.com/en-us/library/bb387061.aspx

Комментарии:

1. Я прочитал некоторую информацию о LINQ to XML, и это довольно многообещающе. Почему никто не проголосовал за этот ответ?

2. Является ли XSD одинаковым для обоих файлов?

3. Глупый вопрос: что такое XSD?

4. одинакова ли схема обоих XML-файлов? XSD — это определение схемы. Проще говоря: одинакова ли структура каждого файла?

5. Если под структурой вы подразумеваете порядок элементов, атрибутов и т.д., То в этом нет необходимости, но, вероятно, это будет то же самое.