2013-01-15 13 views
15

In diesem Moment verwalte ich eine Software, die mehrere XML-Konfigurationsdateien hat. Wenn eine neue Version der Software veröffentlicht wird, ändern sich manchmal die Basiskonfigurationsdateien, wir haben derzeit beim Start den Softwareruf KDiff. Wenn eine Änderung festgestellt wird, wird der Benutzer aufgefordert, die Änderungen auszuwählen.Programmatic XML Diff/Zusammenführen in C#

Das Problem bei diesem Ansatz ist, dass KDiff eine Linie zu vergleichen Programm ist und nicht über die Möglichkeiten von XML (wie Knoten, etc.)

Im Idealfall würde Ich mag programmatisch mit einer Bibliothek in C# arbeiten (Da wir ein MS-Shop sind), der zwei XML-Dateien vergleichen kann: eine Quell-XML und eine aktuelle Arbeits-XML.

Und dann verschmelzen die beiden zusammen ein paar einfache Regeln:

  1. Wenn die aktuelle XML-Arbeits einen Knoten hat, dass die Quelle XML nicht, es zu entfernen.
  2. Wenn die Quell-XML einen Knoten enthält, den die aktuelle Arbeits-XML nicht enthält, fügen Sie sie hinzu.
  3. Wenn beide denselben Knoten haben und die Werte unterschiedlich sind, bevorzugen Sie den Wert der Quell-XML, es sei denn, der Wert der Quell-XML ist auf "UseExistingValue" eingestellt.

Zum Beispiel, hier ist die "Quelle" XML:

<Configuration> 
    <Items> 
    <Item Id="1" Position="true"> 
     <Location X="UseExistingValue" Y="UseExistingValue" Z="UseExistingValue" /> 

     <Something/> 
     <SomethingElse/> 
    </Item> 
    </Items> 
</Configuration> 

Und hier ist die "Current Working" XML:

<Configuration> 
    <Items> 
    <Item Id="1" Position="false"> 
     <Location X="123" Y="234" Z="345" /> 
     <Another/> 
     <Something/> 

    </Item> 
    </Items> 
</Configuration> 

Und das fusionierte Version würde wie folgt aussehen:

<Configuration> 
    <Items> 
    <Item Id="1" Position="true"> 
     <Location X="123" Y="234" Z="345" /> 

     <Something/> 
     <SomethingElse/> 
    </Item> 
    </Items> 
</Configuration> 

Ich habe mir die MS XML Diff and Patch Tool angesehen und es defini Sie fügt die Dateien zusammen, erlaubt aber nicht die programmatischen Regeln, die ich definieren möchte.

XMLUnit for Java devs scheint vielversprechend, aber die .NET-Version davon scheint unterentwickelt, was bedauerlich ist.

Jeder hat irgendwelche Vorschläge für entweder skriptfähige XML-Diff/Merge-Tools und/oder .NET-Bibliotheken (kostenpflichtig oder kostenlos)?

Danke.

Antwort

19

Nach ein paar Tagen herumspielen, fand ich eine Lösung, die meiner Meinung nach für mich funktioniert. Vielleicht könnte es auch für andere Menschen funktionieren.

The MS XML Diff and Patch tool war eine praktikable Option. Wenn Sie die erste Datei mit der zweiten Datei vergleichen, wird ein XML "DiffGram" erstellt, das aufführt, welche Änderungen zwischen den beiden XML-Dateien festgestellt werden.

Um alle 3 Regeln zu berücksichtigen, die ich oben aufgeführt habe, habe ich die beiden Dateien in eine Richtung aufgeteilt, dann die DiffGram-Datei mit Linq-to-XML geöffnet und alle Zeilen "Hinzufügen" und "Entfernen" entfernt .

Dann habe ich dieses editierte Diffgramm gegen die erste Datei gepatcht (zusammengeführt) und eine teilweise zusammengelegte temporäre Datei erstellt. Dies erledigt die Regeln 1 und 2.

Als nächstes habe ich die teilweise zusammengeführte Datei gegen die erste verwendete Datei verglichen.Dann öffnete das neue DiffGram und entfernte alle Change-Referenzen auf "UseExistingValue".

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

und fusionierte diese editierten DiffGram gegen die teilweise zusammengefügte Datei, die Pflege der Regel dauert 3. Speichern diese in XML heraus erzeugt dann die endgültige XML-merged nach den Regeln oben definiert sind.

Hoffentlich kann anderen Menschen helfen.

TIPP: Nach der XmlDiffPatch Bibliothek installiert hat, kann die XmlDiffPatch DLL in C: \ Windows \ assembly \ GAC \ XmlDiffPatch \ 1.0.8.28__b03f5f7f11d50a3a \ XmlDiffPatch.dll

+13

installieren XMLDiffPatch von NuGet finden Sie unter http: //www.nuget.org/packages/XMLDiffPatch/ – Contango