Ho 4 file XML: A, B, C e D. Voglio sapere se la differenza tra A e B è uguale alla differenza tra C e D.
I file XML sono serializzazioni dello stesso oggetto .NET; una delle differenze principali sarà in un particolare elenco che descrive le funzionalità disponibili su un particolare prodotto. (Una descrizione della funzione è di per sé un altro oggetto).
Tutti e quattro hanno strutture molto simili, ma ci possono essere valori presenti in uno che non sono presenti in un altro, e alcuni valori possono essere cambiati. Ad esempio, se consideriamo il documento A
:
<xmldoc>
<a></a>
<c></c>
<d></d>
<xmldoc>
Documento B
:
<xmldoc>
<a></a>
<b></b> -- Added
<c></c> -- C and D are still ordered in the same way (except for the addition of <b>
<d></d>
<e></e> -- Also added, but it doesn't affect the sort of the other ones
<xmldoc>
Ora supponiamo di avere i seguenti documenti. Il documento C
è esattamente identico al documento A
:
<xmldoc>
<a></a>
<c></c>
<d></d>
<xmldoc>
Il documento D
è identico al documento B
.
Poiché la differenza tra C
e D
è esattamente uguale alla differenza tra A
e B
, questo dovrebbe passare. Tuttavia, supponiamo di avere invece il documento D
come segue:
<xmldoc>
<a></a>
<b></b>
<f></f> <!-- Added -->
<c></c>
<d></d>
<e></e>
<f></f>
<xmldoc>
La differenza tra C
e D
non è più uguale alla differenza tra A
e B
.
Sono abbastanza sicuro che non avremo un caso in cui il documento A
si presenta come:
<xmldoc>
<c></c>
<a></a> -- This is the same as the original document A except that this was reordered - this shouldn't happen
<d></d>
<xmldoc>
Il mio primo pensiero è stato quello di utilizzare la libreria XML Diff Patch di Microsoft, che confronta due file e genera un DiffGram, che è un documento XML che descrive la differenza tra i due file confrontati. Il mio pensiero è che potrei confrontare A a B per ottenere DiffGram X e C a D per ottenere DiffGram Y, e quindi fare un terzo confronto XML tra X e Y.
L'idea suona bene sulla carta; sfortunatamente non si sta rivelando così semplice. La differenza tra A e B è molto simile alla differenza tra C e D, ma X e Y non assomigliano l'un l'altro.
Il problema è che dà a DiffGram il seguente:
<xd:node match="4">
<xd:node match="2">
<xd:node match="1">
<xd:remove match="1-3" />
</xd:node>
</xd:node>
<xd:node match="1">
<xd:node match="1">
<xd:remove match="1-3" />
</xd:node>
</xd:node>
</xd:node>
Questo ha due problemi: in primo luogo, è estremamente criptico - preferirei che fosse più leggibile dall'uomo, ma non è la fine del mondo se non è così (dal mio lo scopo principale è programmatico qui). In secondo luogo (e molto più criticamente), sembra che sia strettamente correlato agli specifici file XML che sono in quel particolare confronto.
Originariamente pubblicato sul Software Recommendation Stack Exchange chiedendo consigli per una libreria .NET (preferibilmente disponibile come pacchetto NuGet) che sarebbe adatta a questo scopo ma non ho avuto molta fortuna ad ottenere una raccomandazione. (Full disclosure: Non ho ancora cancellato quella domanda ma intendo farlo a breve). Se esiste una libreria di questo tipo, non sono stato in grado di trovarla (molti di essi sembrano non essere progettati per lo scopo in cui voglio usarli e / o non sono scritti per il framework .NET), ma se qualcuno è a conoscenza di una tale libreria che sarebbe sicuramente una soluzione accettabile (in effetti, preferirei strongmente che dovessi implementarla da solo).
Qualcuno ha fatto qualcosa di simile (creando la propria soluzione, usando la libreria Microsoft XML Diff o usando un'altra libreria di terze parti)? Se sì, cosa hai fatto?
Spero che non sia una domanda troppo ampia (se è così fammelo sapere e modifico), ma quale sarebbe un buon approccio se finissi per scrivere da solo?