Comparazione di XML

Una delle problematiche tipiche che ci troviamo ad affrontare spesso è comparare due file XML. La comparazione mediante stringhe è impossibile, dato che per la semantica XML, i due file seguenti sono uguali

<Dati A="a" B="b" />
<Dati B="b" A="a" />

Come fare?

Oggi ho scoperto che dentro la classe Cryptography esiste una classe chiamata (con un nome tra i più astrusi dell'universo) XmlDsigC14NTransform che si occupa (per motivi completamente diversi da quelli che servono a noi) di trasformare l'Xml in una rappresentazione canonizzata, quindi utilizzabile per fare comparazioni che non considerino gli elementi "estranei" dell'Xml (ordine dei nodi, whitespace, ecc.).

Quindi, con poche righe di codice, si riesce a comparare facilmente un XML:

using System;
using System.ComponentModel;
using System.IO;
using System.Security.Cryptography.Xml;
using System.Windows.Forms;
using System.Xml;

XmlDocument doc1 = new XmlDocument();
doc1.Load(filename1);
XmlDocument doc2 =
new XmlDocument();
doc2.Load(filename2);

XmlDsigC14NTransform t1 = new XmlDsigC14NTransform();
t1.LoadInput(doc1);
XmlDsigC14NTransform t2 =
new XmlDsigC14NTransform();
t2.LoadInput(doc2);

Stream s1 = (Stream) t1.GetOutput(typeof (Stream));
Stream s2 = (Stream) t2.GetOutput(
typeof (Stream));

if (s1.Length != s2.Length)
    // Files are diffent (length)

for (Int32 index = 0; index < s1.Length; index++){
 
if (s1.ReadByte() != s2.ReadByte()){
     // Files are different

  }
}