What is the best way to compare XML files for equality? What is the best way to compare XML files for equality? xml xml

What is the best way to compare XML files for equality?


It really depends on what you want to check as "differences".

Right now, we're using Microsoft XmlDiff: http://msdn.microsoft.com/en-us/library/aa302294.aspx


You might find it's less fragile to parse the XML into an XmlDocument and base your Assert calls on XPath Query. Here are some helper assertion methods that I use frequently. Each one takes a XPathNavigator, which you can obtain by calling CreateNavigator() on the XmlDocument or on any node retrieved from the document. An example of usage would be:

     XmlDocument doc = new XmlDocument( "Testdoc.xml" );     XPathNavigator nav = doc.CreateNavigator();     AssertNodeValue( nav, "/root/foo", "foo_val" );     AssertNodeCount( nav, "/root/bar", 6 )    private static void AssertNodeValue(XPathNavigator nav,                                         string xpath, string expected_val)    {        XPathNavigator node = nav.SelectSingleNode(xpath, nav);        Assert.IsNotNull(node, "Node '{0}' not found", xpath);        Assert.AreEqual( expected_val, node.Value );    }    private static void AssertNodeExists(XPathNavigator nav,                                         string xpath)    {        XPathNavigator node = nav.SelectSingleNode(xpath, nav);        Assert.IsNotNull(node, "Node '{0}' not found", xpath);    }    private static void AssertNodeDoesNotExist(XPathNavigator nav,                                         string xpath)    {        XPathNavigator node = nav.SelectSingleNode(xpath, nav);        Assert.IsNull(node, "Node '{0}' found when it should not exist", xpath);    }    private static void AssertNodeCount(XPathNavigator nav, string xpath, int count)    {        XPathNodeIterator nodes = nav.Select( xpath, nav );        Assert.That( nodes.Count, Is.EqualTo( count ) );    }


Doing a simple string compare on a xml string not always work. Why ?

for example both :

<MyElement></MyElmennt> and <MyElment/> are equal from an xml standpoint ..

There are algorithms for converting making an xml always look the same, they are called canonicalization algorithms. .Net has support for canonicalization.