Программный XML Diff / Merge в C#

в данный момент я управляю частью программного обеспечения, которая имеет несколько файлов конфигурации XML. Когда новая версия программного обеспечения выпущена, иногда базовые файлы конфигурации меняются, в настоящее время у нас есть программный вызов KDiff при запуске. Если он обнаруживает изменение, он предлагает пользователю выбрать изменения.

проблема с этим подходом заключается в том, что KDiff является программой сравнения строк и не знает способов XML (например, узлов и т. д.)

В Идеале, Я хотелось бы программно работать с библиотекой на C# (поскольку мы MS shop), которая может различать два XML-файла: исходный XML и текущий рабочий XML.

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

  1. если текущий рабочий XML имеет узел, которого нет в исходном XML, удалите его.
  2. если исходный XML имеет узел, которого нет в текущем рабочем XML, добавьте его.
  3. если оба имеют один и тот же узел и значения отличаются, выберите значение исходного 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 файлы