XmlCompare.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using System.Xml;
  3. namespace XmlCompare
  4. {
  5. /// <summary>
  6. /// Summary description for XmlCompare.
  7. /// </summary>
  8. public class XmlCompare
  9. {
  10. [Flags]
  11. public enum Flags {
  12. IgnoreNone=0,
  13. IgnoreAttribOrder=1,
  14. }
  15. Flags flags;
  16. public XmlCompare (Flags flags)
  17. {
  18. this.flags = flags;
  19. }
  20. public XmlCompare ()
  21. :this (Flags.IgnoreNone)
  22. {
  23. }
  24. public bool AreEqualAttribs (XmlAttributeCollection attrs1, XmlAttributeCollection attrs2)
  25. {
  26. if (attrs1.Count != attrs2.Count)
  27. return false;
  28. for (int i=0; i<attrs1.Count; i++) {
  29. if ((flags & Flags.IgnoreAttribOrder) != 0) {
  30. string ln = attrs1[i].LocalName;
  31. string ns = attrs1[i].NamespaceURI;
  32. string val = attrs1[i].Value;
  33. XmlAttribute atr2 = attrs2[ln, ns];
  34. if (atr2 == null || atr2.Value != val)
  35. return false;
  36. } else {
  37. if (attrs1 [i].LocalName != attrs2 [i].LocalName)
  38. return false;
  39. if (attrs1 [i].NamespaceURI != attrs2 [i].NamespaceURI)
  40. return false;
  41. if (attrs1 [i].Value != attrs2 [i].Value)
  42. return false;
  43. }
  44. }
  45. return true;
  46. }
  47. public bool AreEqualNodeList (XmlNodeList lst1, XmlNodeList lst2)
  48. {
  49. if (lst1.Count != lst2.Count)
  50. return false;
  51. for (int i=0; i<lst1.Count; i++) {
  52. if (!AreEqual (lst1[i], lst2[i]))
  53. return false;
  54. }
  55. return true;
  56. }
  57. public bool AreEqual (XmlNode node1, XmlNode node2)
  58. {
  59. if (node1.NodeType != node2.NodeType)
  60. return false;
  61. if (node1.LocalName != node2.LocalName)
  62. return false;
  63. if (node1.NamespaceURI != node2.NamespaceURI)
  64. return false;
  65. if (node1.Attributes != null && node2.Attributes != null) {
  66. if (!AreEqualAttribs (node1.Attributes, node2.Attributes))
  67. return false;
  68. }
  69. else //one of nodes has no attrs
  70. if (node1.Attributes != null || node2.Attributes != null)
  71. return false;//and another has some
  72. if (!node1.HasChildNodes && !node2.HasChildNodes)
  73. return node1.Value == node2.Value;
  74. else {//one of nodes has some children
  75. if (!node1.HasChildNodes || !node2.HasChildNodes)
  76. return false;//and another has none
  77. return AreEqualNodeList (node1.ChildNodes, node2.ChildNodes);
  78. }
  79. }
  80. static void Main ()
  81. {
  82. XmlDocument doc1 = new XmlDocument ();
  83. XmlDocument doc2 = new XmlDocument ();
  84. XmlDocument doc3 = new XmlDocument ();
  85. XmlDocument doc4 = new XmlDocument ();
  86. doc1.LoadXml (@"<?xml version=""1.0""?>
  87. <doc>
  88. <element attr1=""1"" attr2=""2"" />
  89. </doc>");
  90. doc2.LoadXml (@"<?xml version=""1.0""?><doc><element attr1=""1"" attr2=""2""/></doc>");
  91. doc3.LoadXml (@"<?xml version=""1.0""?><doc><element attr2=""2"" attr1=""1""/></doc>");
  92. doc4.LoadXml (@"<?xml version=""1.0""?><doc><element attr3=""3"" attr2=""2""/></doc>");
  93. XmlCompare cmp1 = new XmlCompare();
  94. XmlCompare cmp2 = new XmlCompare(Flags.IgnoreAttribOrder);
  95. Console.Out.WriteLine (cmp1.AreEqual (doc1, doc2).ToString ());
  96. Console.Out.WriteLine (cmp1.AreEqual (doc1, doc3).ToString ());
  97. Console.Out.WriteLine (cmp2.AreEqual (doc1, doc3).ToString ());
  98. Console.Out.WriteLine (cmp2.AreEqual (doc1, doc4).ToString ());
  99. }
  100. }
  101. }