2 using System.Collections;
\r
5 public class XmlComparer
\r
7 public class ComparisonException : Exception
\r
9 public ComparisonException (string message)
\r
15 static bool debug = false;
\r
18 public static void Main (string [] args)
\r
20 if (args.Length < 2) {
\r
21 Console.Error.WriteLine ("Usage: xmldocdiff [reference_output.xml] [actual_output.xml]");
\r
24 if (args.Length > 2 && args [2].EndsWith ("-debug"))
\r
28 Run (args[0], args[1]);
\r
29 } catch (Exception ex) {
\r
30 Console.WriteLine ("FAIL: " + args [1]);
\r
33 Console.WriteLine ("PASS: " + args [1]);
\r
36 public static void Compare (string reference, string output)
\r
38 XmlDocument doc1 = new XmlDocument ();
\r
39 doc1.Load (reference);
\r
40 XmlDocument doc2 = new XmlDocument ();
\r
43 XmlNodeList memberList1 = doc1.SelectNodes ("/doc/members/member");
\r
44 XmlNodeList memberList2 = doc2.SelectNodes ("/doc/members/member");
\r
46 Hashtable namedItems = new Hashtable ();
\r
48 foreach (XmlElement el in memberList1)
\r
49 namedItems.Add (el.GetAttribute ("name"), el);
\r
50 foreach (XmlElement el2 in memberList2) {
\r
51 string name = el2.GetAttribute ("name");
\r
52 XmlElement el1 = namedItems [name] as XmlElement;
\r
54 Report ("Extraneous element found. Name is '{0}'", name);
\r
57 namedItems.Remove (name);
\r
59 CompareNodes (el1, el2);
\r
62 foreach (string name in namedItems.Keys)
\r
63 Report ("Expected comment was not found. Name is {0}, XML is {1}", name, ((XmlElement) namedItems [name]).OuterXml);
\r
65 // finally, check other nodes than members
\r
66 doc1.SelectSingleNode ("/doc/members").RemoveAll ();
\r
67 doc2.SelectSingleNode ("/doc/members").RemoveAll ();
\r
68 string xml1 = doc1.OuterXml.Replace ("\r", "").Trim ();
\r
69 string xml2 = doc2.OuterXml.Replace ("\r", "").Trim ();
\r
71 Report (@"Either of doc, assembly, name, members elements are different.
\r
73 doc2: {1}", xml1, xml2);
\r
76 private static void CompareNodes (XmlNode n1, XmlNode n2)
\r
79 Report (@"Nodes does not exist:
\r
80 Node1: {0}", n1.OuterXml);
\r
83 if (n1.NodeType != n2.NodeType) {
\r
84 Report (@"Nodes differ:
\r
86 Node2: {1}", n1.OuterXml, n2.OuterXml);
\r
89 if (n1.Name != n2.Name) {
\r
90 Report (@"Node names differ:
\r
92 Node2: {1}", n1.OuterXml, n2.OuterXml);
\r
95 if (n1 is XmlElement) {
\r
96 for (int i = 0; i < n1.Attributes.Count; i++)
\r
97 CompareNodes (n1.Attributes [i],
\r
99 for (int i = 0; i < n1.ChildNodes.Count; i++)
\r
100 CompareNodes (n1.ChildNodes [i],
\r
101 n2.ChildNodes [i]);
\r
103 if (n1.NodeType != XmlNodeType.Comment && n1.Value != null) {
\r
104 string v1 = n1.Value.Trim ().Replace ("\r", "");
\r
105 string v2 = n2.Value.Trim ().Replace ("\r", "");
\r
107 Report (@"Node values differ:
\r
109 Node2: {1}", v1, v2);
\r
113 static void Report (string format, params object [] args)
\r
116 Console.WriteLine (format, args);
\r
118 throw new ComparisonException (String.Format (format, args));
\r