Программный XML Diff / Merge в C#
в данный момент я управляю частью программного обеспечения, которая имеет несколько файлов конфигурации XML. Когда новая версия программного обеспечения выпущена, иногда базовые файлы конфигурации меняются, в настоящее время у нас есть программный вызов KDiff при запуске. Если он обнаруживает изменение, он предлагает пользователю выбрать изменения.
проблема с этим подходом заключается в том, что KDiff является программой сравнения строк и не знает способов XML (например, узлов и т. д.)
В Идеале, Я хотелось бы программно работать с библиотекой на C# (поскольку мы MS shop), которая может различать два XML-файла: исходный XML и текущий рабочий XML.
и затем объединить два вместе, используя несколько простых правил:
- если текущий рабочий XML имеет узел, которого нет в исходном XML, удалите его.
- если исходный XML имеет узел, которого нет в текущем рабочем XML, добавьте его.
- если оба имеют один и тот же узел и значения отличаются, выберите значение исходного XML, если только значение исходного XML не установлено в "UseExistingValue".
например, вот" исходный " XML:
<Configuration>
<Items>
<Item Id="1" Position="true">
<Location X="UseExistingValue" Y="UseExistingValue" Z="UseExistingValue" />
<Something/>
<SomethingElse/>
</Item>
</Items>
</Configuration>
и вот" текущий рабочий " XML:
<Configuration>
<Items>
<Item Id="1" Position="false">
<Location X="123" Y="234" Z="345" />
<Another/>
<Something/>
</Item>
</Items>
</Configuration>
и объединенная версия будет выглядеть так:
<Configuration>
<Items>
<Item Id="1" Position="true">
<Location X="123" Y="234" Z="345" />
<Something/>
<SomethingElse/>
</Item>
</Items>
</Configuration>
и MS XML Diff и патч инструмент и он определенно объединяет файлы вместе, но не учитывает программные правила, которые я хочу определять.
XMLUnit для разработчиков Java кажется многообещающим, но .NET-версия кажется недостаточно развитой, что к сожалению.
У кого-нибудь есть предложения для скриптовых инструментов XML Diff/Merge и/или библиотек .NET (платных или бесплатных)?
спасибо.
1 ответов
после нескольких дней возни, я нашел решение, которое, я думаю, работает для меня. Может быть, это сработает и для других людей.
MS XML Diff и патч инструмент является жизнеспособным вариантом. Когда вы отличаете первый файл от второго файла, он создает XML - "DiffGram", перечисляющий, какие изменения он обнаружил между двумя XML-файлами.
позаботиться обо всех 3 правила, которые я перечислил выше, я бы дифф двух файлов в одном направлении, затем открыл дельты файл с помощью Linq-to-XML и удалены все строки" добавить "и" удалить".
XNamespace xd = "http://schemas.microsoft.com/xmltools/2002/xmldiff";
var doc = XDocument.Load(_diffGramFile);
doc.Root.DescendantsAndSelf(xd + "add").Remove();
doc.Root.DescendantsAndSelf(xd + "remove").Remove();
затем я Латал (слился) этот отредактированы дельты на первый файл и создал частично слился временный файл. Этом правила 1 и 2.
далее, я отличил частично объединенный файл от первого используемого файла. Затем открыл новый дельты и удалены все изменения ссылки на "UseExistingValue".
var newdoc = XDocument.Load(_diffGramFile);
newdoc.Root.DescendantsAndSelf(xd + "change")
.Where(x => x.Value == "UseExistingValue").Remove();
и слили эту отредактированы дельты против частично объединенный файл, который заботится о правиле 3. Сохранение этого в XML затем создает окончательный XML, объединенный в соответствии с правилами, определенными выше.
надеюсь, это может помочь другим людям.
подсказка: после установки библиотеки XmlDiffPatch DLL XmlDiffPatch можно найти в C:\Windows\assembly\GAC\XmlDiffPatch\1.0.8.28__b03f5f7f11d50a3a\XmlDiffPatch - ... dll файлы