2010-05-27 10 views

risposta

10

No. XmlDocument non sostituisce il comportamento del metodo Equals() così, è infatti proprio svolgimento parità riferimento - che sarà sicuro nel tuo esempio, a meno che i documenti siano effettivamente la stessa istanza di oggetto.

Se si desidera confrontare i contenuti (attributi, elementi, commmenti, PI, ecc.) Di un documento, è necessario implementare tale logica da soli.Attenzione: non è banale.

A seconda del tuo scenario esatto, potresti essere in grado di rimuovere tutti gli spazi non essenziali dal documento (che a sua volta può essere difficile) e confrontare il testo xml risultante. Questo non è perfetto: fallisce per documenti semanticamente identici, ma differiscono in cose come il modo in cui gli spazi dei nomi sono usati e dichiarati, o se certi valori sono sfuggiti o meno, l'ordine degli elementi e così via. Come ho detto prima, il confronto XML non è banale.

È inoltre necessario definire chiaramente cosa significa per due documenti XML essere "identici". L'ordine degli elementi o degli attributi è importante? Il caso (nei nodi di testo) è importante? Dovresti ignorare le sezioni CDATA superflue? Contare le istruzioni di elaborazione? Che dire di spazi qualificati completi e parzialmente qualificati?

In qualsiasi implementazione di scopo generale, è probabile che si desideri trasformare entrambi i documenti in una forma canonica (sia XML che in qualche altra rappresentazione) e quindi confrontare il contenuto canonizzato.

Esistono già strumenti che eseguono il differenziamento XML, come Microsoft XML Diff/Patch,, che è possibile sfruttare per identificare le differenze tra due documenti. Per quanto ne so, lo strumento non è distribuito in forma sorgente ... quindi per utilizzarlo in un'applicazione incorporata è necessario eseguire lo script del processo (se si prevede di utilizzarlo, è necessario innanzitutto verificare che i termini di licenza consentano l'uso e la ridistribuzione).

EDIT:Partenza @Max Toro's answer se si sta utilizzando .NET 3.5 SP1, come a quanto pare c'è un'opzione in XLinq che può essere utile. Bello sapere che esiste.

0

LBushkin ha ragione, questo non è banale. Poiché XML è una stringa di dati, è possibile eseguire tecnicamente un hash dei contenuti e confrontarli, ma ciò sarà influenzato da cose come gli spazi bianchi.

È possibile eseguire un diff strutturato (chiamato anche 'XML diffgram') tra i due documenti e confrontare i risultati. Questo è il modo in cui i dataset .NET tengono traccia delle modifiche, ad esempio.

Oltre a ciò, è necessario eseguire un'iterazione nel DOM e confrontare elementi, attributi e valori tra loro. Se è coinvolto uno schema, dovresti anche prendere in considerazione le posizioni e così via.

31

Provare il metodo DeepEquals sull'API XLinq.

XDocument doc1 = GetDoc1(); 
XDocument doc2 = GetDoc2(); 

if(XNode.DeepEquals(doc1, doc2)) 
{ 

} 

Vedi anche Equality Semantics of LINQ to XML Trees

+0

Non lo sapevo, grazie. –

+0

Molto bello. Non sapevo che esistesse. Sembra che gestisca molti dei casi che descrivo. – LBushkin

+0

Bello - questo significa che non ho bisogno di importare una libreria di terze parti per fare questo per me! –

8

Un modo semplice potrebbe essere quella di confrontare OuterXml.

var a = new XmlDocument(); 
var b = new XmlDocument(); 

a.LoadXml("<root foo='bar' />"); 
b.LoadXml("<root foo='bar'/>"); 

Debug.Assert(a.OuterXml == b.OuterXml);