4 using System.Collections;
\r
7 public class XmlComparer
\r
9 public class ComparisonException : Exception
\r
11 public ComparisonException (string message)
\r
17 static bool debug = false;
\r
20 public static void Main (string [] args)
\r
22 if (args.Length < 2) {
\r
23 Console.Error.WriteLine ("Usage: xmldocdiff [reference_output.xml] [actual_output.xml]");
\r
26 if (args.Length > 2 && args [2].EndsWith ("-debug"))
\r
30 Run (args[0], args[1]);
\r
31 } catch (Exception ex) {
\r
32 Console.WriteLine ("FAIL: " + args [1]);
\r
35 Console.WriteLine ("PASS: " + args [1]);
\r
38 public static void Compare (string reference, string output)
\r
40 XmlDocument doc1 = new XmlDocument ();
\r
41 doc1.Load (reference);
\r
42 XmlDocument doc2 = new XmlDocument ();
\r
45 XmlNodeList memberList1 = doc1.SelectNodes ("/doc/members/member");
\r
46 XmlNodeList memberList2 = doc2.SelectNodes ("/doc/members/member");
\r
48 Hashtable namedItems = new Hashtable ();
\r
50 foreach (XmlElement el in memberList1)
\r
51 namedItems.Add (el.GetAttribute ("name"), el);
\r
52 foreach (XmlElement el2 in memberList2) {
\r
53 string name = el2.GetAttribute ("name");
\r
54 XmlElement el1 = namedItems [name] as XmlElement;
\r
56 Report ("Extraneous element found. Name is '{0}'", name);
\r
59 namedItems.Remove (name);
\r
61 CompareNodes (el1, el2);
\r
64 foreach (string name in namedItems.Keys)
\r
65 Report ("Expected comment was not found. Name is {0}, XML is {1}", name, ((XmlElement) namedItems [name]).OuterXml);
\r
67 // finally, check other nodes than members
\r
68 doc1.SelectSingleNode ("/doc/members").RemoveAll ();
\r
69 doc2.SelectSingleNode ("/doc/members").RemoveAll ();
\r
70 string xml1 = doc1.OuterXml.Replace ("\r", "").Trim ();
\r
71 string xml2 = doc2.OuterXml.Replace ("\r", "").Trim ();
\r
73 Report (@"Either of doc, assembly, name, members elements are different.
\r
75 doc2: {1}", xml1, xml2);
\r
78 private static void CompareNodes (XmlNode n1, XmlNode n2)
\r
81 Report (@"Nodes does not exist:
\r
82 Node1: {0}", n1.OuterXml);
\r
85 if (n1.NodeType != n2.NodeType) {
\r
86 Report (@"Nodes differ:
\r
88 Node2: {1}", n1.OuterXml, n2.OuterXml);
\r
91 if (n1.Name != n2.Name) {
\r
92 Report (@"Node names differ:
\r
94 Node2: {1}", n1.OuterXml, n2.OuterXml);
\r
97 if (n1 is XmlElement) {
\r
98 for (int i = 0; i < n1.Attributes.Count; i++)
\r
99 CompareNodes (n1.Attributes [i],
\r
100 n2.Attributes [i]);
\r
101 for (int i = 0; i < n1.ChildNodes.Count; i++)
\r
102 CompareNodes (n1.ChildNodes [i],
\r
103 n2.ChildNodes [i]);
\r
105 if (n1.NodeType != XmlNodeType.Comment && n1.Value != null) {
\r
106 string v1 = n1.Value.Trim ().Replace ("\r", "");
\r
107 string v2 = n2.Value.Trim ().Replace ("\r", "");
\r
109 Report (@"Node values differ:
\r
111 Node2: {1}", v1, v2);
\r
115 static void Report (string format, params object [] args)
\r
118 Console.WriteLine (format, args);
\r
120 throw new ComparisonException (String.Format (format, args));
\r