I had to compare two xml files today. This is trickier than you would at first think. Luckily Microsoft has a neat tool, XmlDiff that makes it quite easy. It can compare two files, or two XmlReaders or even fragments. Also it can spit out an xml diffgram so that you can examine and re-apply any changes. Just use it like this...
[Test] public void XmlDiffTest() { string source = "<root><child1>some text</child1><child2>more text</child2></root>"; // note some whitespace, child nodes in different order, comments string target = "<root> <!-- I'm a comment --> <child2>more text</child2> " + "<child1>some text</child1> </root>"; XmlReader expected = XmlReader.Create(new StringReader(source)); XmlReader actual = XmlReader.Create(new StringReader(target)); StringBuilder differenceStringBuilder = new StringBuilder(); XmlWriter differenceWriter = XmlWriter.Create(new StringWriter(differenceStringBuilder)); XmlDiff diff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder | XmlDiffOptions.IgnoreComments | XmlDiffOptions.IgnoreWhitespace); bool areDifferent = diff.Compare(expected, actual, differenceWriter); Assert.IsTrue(areDifferent, string.Format( "expected response and actual response differ:\r\n{0}", differenceStringBuilder.ToString())); }
The information about the XmlDiff tool has been moved here: http://msdn2.microsoft.com/en-us/library/aa302294.aspx
ReplyDeleteDon't forget your using statements around StringReader and XmlReader.
ReplyDeleteThank you for the useful code. It puzzled me for a while, until I found out that Compare returns true, if the two are identical. So the code should be areDifferent = !Compare.
ReplyDelete