2013-01-15 15 views
15

In questo momento, sto gestendo un software che ha più file di configurazione XML. Quando viene rilasciata una nuova versione del software, a volte cambiano i file di configurazione di base, al momento abbiamo la chiamata software KDiff all'avvio. Se rileva una modifica, richiede all'utente di scegliere le modifiche.Differenziale XML programmatico in C#

Il problema di questo approccio è che KDiff è un programma di confronto tra la linea e non a conoscenza dei modi di XML (come nodi, etc.)

Idealmente, mi piacerebbe lavorare a livello di codice con una libreria in C# (dal momento che siamo un negozio di MS) che può diffare due file XML: un XML di origine e un XML di lavoro corrente.

e quindi unire le due cose insieme con alcune semplici regole:

  1. Se la corrente di lavoro XML ha un nodo che l'origine XML non, rimuoverlo.
  2. Se l'XML di origine ha un nodo che non funziona nel file XML corrente, aggiungerlo.
  3. Se entrambi hanno lo stesso nodo e i valori differiscono, favorire il valore del codice XML di origine, a meno che il valore del codice XML di origine sia impostato su "UseExistingValue".

Per esempio, ecco la "Sorgente" XML:

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

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

Ed ecco la "Corrente di funzionamento" XML:

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

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

E la versione risultante dalla fusione sarà simile:

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

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

Ho guardato il MS XML Diff and Patch Tool e questo defini unisce i file insieme, ma non consente le regole programmatiche che voglio definire.

XMLUnit for Java devs sembra promettente, ma la versione .NET sembra sottosviluppata, il che è sfortunato.

Qualcuno ha suggerimenti per gli strumenti di diffusione/unione XML con script e/o per le librerie .NET (a pagamento o gratuite)?

Grazie.

risposta

19

Dopo un paio di giorni passati a fare confusione, ho trovato una soluzione che penso funzioni per me. Forse potrebbe funzionare anche per altre persone.

The MS XML Diff and Patch tool era un'opzione valida. Quando dividi il primo file rispetto al secondo file, viene creato un "DiffGram" XML che elenca le modifiche che ha rilevato tra i due file XML.

Per gestire tutte e 3 le regole sopra elencate, ho diffdato i due file in una direzione, poi ho aperto il file DiffGram utilizzando Linq-to-XML e rimosso tutte le righe "Aggiungi" e "Rimuovi" .

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

Poi ho ricucito (fusa) questo diffgram cura contro il primo file e ha creato un parzialmente fusa file temporaneo. Si occupa delle Regole 1 e 2.

Successivamente, ho diffdato il file parzialmente unito rispetto al primo file utilizzato.Quindi ha aperto il nuovo DiffGram e rimosso tutti i riferimenti di modifica a "UseExistingValue".

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

E fuse questo DiffGram modificato contro il file parzialmente fusa che si prende cura della regola 3. Risparmio questo fuori in XML produce poi il codice XML finale fuse secondo le regole sopra definiti.

Speriamo che questo possa aiutare altre persone.

SUGGERIMENTO: Dopo aver installato la libreria XmlDiffPatch, la DLL XmlDiffPatch si trova in C: \ Windows \ assembly \ GAC \ XmlDiffPatch \ 1.0.8.28__b03f5f7f11d50a3a \ XmlDiffPatch.dll

+13

Per installare XMLDiffPatch da NuGet, vedi http: //www.nuget.org/packages/XMLDiffPatch/ – Contango

Problemi correlati