Как сравнить 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 будет отображаться, даже если элементы находятся в другом месте родительского узла.