Как сравнить XML-файлы в C #? - PullRequest
10 голосов
/ 11 ноября 2011

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

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

И все же я не знаю, стоит ли мне использовать DOM или Xpath. Какие-либо предложения ?

РЕДАКТИРОВАТЬ:

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

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

Ответы [ 3 ]

19 голосов
/ 11 ноября 2011

Microsoft XML Diff and Patch 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();
}

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

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();
    }
}
5 голосов
/ 01 июля 2013

Если вы хотите просто сравнить XML и вам не нужно получать разницу, вы можете использовать XNode.DeepEquals Method :

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));
4 голосов
/ 11 ноября 2011

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

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