#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. Если под структурой вы подразумеваете порядок элементов, атрибутов и т.д., То в этом нет необходимости, но, вероятно, это будет то же самое.