2013-01-15 10 views
15

W tej chwili zarządzam oprogramowaniem, które ma wiele plików konfiguracyjnych XML. Kiedy pojawia się nowa wersja oprogramowania, czasami zmieniają się podstawowe pliki konfiguracyjne, obecnie po uruchomieniu mamy wywołanie oprogramowania KDiff. Jeśli wykryje zmianę, prosi użytkownika o wybranie zmian.Programowe XML Diff/Scal w C#

Problem z tego podejścia jest to, że KDiff to linia porównywania programu i nie świadomy sposobów XML (jak węzłów, etc.)

Idealnie chciałbym programowo pracować z biblioteką w C# (ponieważ jesteśmy sklepem MS), który może Diff dwa pliki XML: Source XML i Current Working XML.

a następnie scalić dwa razem stosując kilka prostych zasad:

  1. Jeżeli prąd roboczy XML posiada węzeł XML Źródło nie, należy go usunąć.
  2. Jeśli źródłowy XML ma węzeł, którego aktualnie działający XML nie ma, dodaj go.
  3. Jeśli oba mają ten sam węzeł, a wartości się różnią, należy faworyzować wartość Source XML, chyba że wartość Source XML jest ustawiona na "UseExistingValue".

Na przykład, tutaj jest "Źródło" XML:

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

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

A oto "Current Working" XML:

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

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

a wersja scalona będzie wyglądać następująco:

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

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

Spojrzałem na MS XML Diff and Patch Tool i jego definicje tely scala pliki razem, ale nie pozwala na określenie reguł programowych, które chcę zdefiniować.

XMLUnit for Java devs wydaje się obiecujący, ale jego wersja .NET wydaje się nierozwinięta, co jest niefortunne.

Ktoś ma jakieś sugestie dotyczące skryptowalnych narzędzi XML Diff/Merge i/lub bibliotek .NET (płatnych lub bezpłatnych)?

Dzięki.

Odpowiedz

19

Po kilku dniach kręcenia się, znalazłem rozwiązanie, które według mnie działa dla mnie. Może to też może działać dla innych ludzi.

The MS XML Diff and Patch tool było realną opcją. Kiedy skompresujesz pierwszy plik względem drugiego pliku, tworzy on plik XML "DiffGram" zawierający listę zmian, które wykrył między dwoma plikami XML.

Aby zająć się wszystkimi 3 regułami, które wymieniłem powyżej, Zróżnicowałem dwa pliki w jednym kierunku, a następnie otworzyłem plik DiffGram za pomocą Linq-to-XML i usunięto wszystkie linie "Dodaj" i "Usuń" .

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(); 

Następnie poprawiłem (scalono) ten zmieniony plik diffgram z pierwszym plikiem i utworzyłem częściowo scalony plik tymczasowy. Zajmuje się Regułami 1 i 2.

Następnie I Diff'd częściowo scalony plik przeciwko pierwszego używanego pliku.Następnie otworzyłem nowy plik DiffGram i usunięto wszystkie odwołania do zmiennej "UseExistingValue".

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

A połączył tę edytowanego DiffGram przeciwko pliku częściowo połączonego który dba o Zasada 3. Oszczędzanie na to uwagę XML następnie wytwarza końcowy XML połączyły się zgodnie z zasadami określonymi powyżej.

Mam nadzieję, że pomoże to innym osobom.

WSKAZÓWKA: Po zainstalowaniu biblioteki XmlDiffPatch The XmlDiffPatch DLL można znaleźć w katalogu C: \ Windows \ assembly \ GAC \ XmlDiffPatch \ 1.0.8.28__b03f5f7f11d50a3a \ XmlDiffPatch.dll

+13

Aby zainstalować XMLDiffPatch z Nuget, zobacz http: //www.nuget.org/packages/XMLDiffPatch/ – Contango

Powiązane problemy