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

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

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

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

EDIT:

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

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

4 ответов


Microsoft XML Diff и патч API должны работать хорошо:

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)
{
    var doc = new XmlDocument();
    doc.Load(originalFile);

    using (var reader = XmlReader.Create(diffGramFile))
    {
        xmlpatch.Patch(sourceDoc, diffgramReader);

        using (var writer = XmlWriter.Create(outputFile))
        {
            doc.Save(writer);
            output.Close();
        }

        reader.Close();
    }
}

Если вы хотите просто сравнить 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));

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


Я написал лист xslt 1.0 Для сравнения одного xml с другим и опубликовал его в своем github здесь:https://github.com/sflynn1812/xslt-diff

Это неупорядоченное сравнение, поэтому элементы, которые не находятся в b.xml но во входном xml будет отображаться, даже если элементы находятся в другом месте родительского узла.