2013-01-15 8 views
15

現在、私は複数のXML設定ファイルを持つソフトウェアを管理しています。新しいバージョンのソフトウェアがリリースされると、基本設定ファイルが変更されることがあります。現在、起動時にKDiffというソフトウェアコールがあります。変更が検出された場合は、ユーザーに変更の選択を求めるプロンプトが表示されます。C言語でのプログラムのXML差分/マージ

このアプローチの問題は、KDiffは(

理想的には(ノードなどのように)、私はプログラム的にC#でのライブラリで作業したいラインの比較プログラムおよびXMLの方法を認識していないということです私たちはMSショップであるため)、ソースXMLと現在の作業XMLの2つのXMLファイルを比較できます。

そして二つが一緒にいくつかの簡単なルールを使用してマージ:

  1. を現在の作業XMLは、ソースXMLは、それを削除しないノードを持っている場合。
  2. ソースXMLに現在の作業XMLにないノードがある場合は、それを追加します。
  3. 両方ともノードが同じで値が異なる場合は、ソースXMLの値が "UseExistingValue"に設定されていない限り、ソースXMLの値を優先します。たとえば、

、ここでは "ソース" 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 and Patch Toolを見てきました。ファイルをまとめてマージしますが、私が定義したいプログラム上のルールは許されません。

XMLUnit for Java devsが有望だと思われますが、.NET版のものは未発達のようですが、残念です。

誰でも、スクリプト可能なXML Diff/Mergeツールや.NETライブラリ(有料または無料)のいずれかの提案がありますか?

ありがとうございました。

答えて

19

数日後に、私は私のために働くと思う解決策を見つけました。多分それは他の人々のために働くことができます。

The MS XML Diff and Patch toolであった。最初のファイルと第2のファイルを比較すると、2つのXMLファイルの間でどのような変更が検出されたかを示すXML「DiffGram」が作成されます。

上記の3つのルールをすべて処理するには、一方向の2つのファイルをdiffし、Linq-to-XMLを使用してDiffGramファイルを開き、すべての「追加」と「削除」行を削除しました。

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(); 
次に、この編集されたdiffgramを最初のファイルにパッチ(マージ)し、部分的にマージされた一時ファイルを作成しました。これはルール1と2を処理します。

次に、部分的にマージされたファイルと最初に使用されたファイルとの差分をとります。その後、新しいDiffGramを開き、 "UseExistingValue"へのすべてのChange参照を削除しました。

var newdoc = XDocument.Load(_diffGramFile); 
newdoc.Root.DescendantsAndSelf(xd + "change") 
     .Where(x => x.Value == "UseExistingValue").Remove(); 

そしてXMLにこの規則3.保存の世話を部分的にマージされたファイルに対して、この編集したDiffGramのを合併は、最終的なXMLは、上記で定義されたルールに従ってマージ生成します。

これが他の人に役立つことを望みます。

ヒント:XmlDiffPatchライブラリをインストールした後、XmlDiffPatch DLLがCで見つけることができます:\ WINDOWS \アセンブリ\ GAC \ XmlDiffPatch \ 1.0.8.28__b03f5f7f11d50a3a \ XmlDiffPatch.dll

+13

NuGetからXMLDiffPatchをインストールするには、HTTPを参照してください。 //www.nuget.org/packages/XMLDiffPatch/ – Contango

関連する問題