private static void AssertHasNoMoreElements(XmlAssert.XmlTree tree)
 {
     if (tree.Elements() != null)
     {
         XmlElement next = tree.NextElement();
         Assert.IsNull(next, "more elements: " + tree.Describe());
     }
 }
        private static void AssertTreeEquals(XmlAssert.XmlTree expected, XmlAssert.XmlTree actual)
        {
            IList <string> checkedActualAttributes;

            for (XmlElement expectedNode = expected.NextElement(); expectedNode != null; expectedNode = expected.NextElement())
            {
                XmlElement actualNode = actual.NextElement();
                Assert.IsNotNull(actualNode, "expected a node " + expected.Describe());
                Assert.AreEqual(GetLocalOrTagName(expectedNode), GetLocalOrTagName(actualNode), expected.Describe());
                Assert.AreEqual(StringUtils.TrimToEmpty(expectedNode.NamespaceURI), StringUtils.TrimToEmpty(actualNode.NamespaceURI), expected
                                .Describe() + " xmlns");
                XmlAttributeCollection actualAttributes = actualNode.Attributes;
                checkedActualAttributes = new List <string>();
                for (int i = 0; i < actualAttributes.Count; i++)
                {
                    checkedActualAttributes.Add(((XmlAttribute)actualAttributes.Item(i)).Name);
                }
                XmlAttributeCollection expectedAttributes = expectedNode.Attributes;
                for (int i = 0; i < expectedAttributes.Count; i++)
                {
                    XmlAttribute attr = (XmlAttribute)expectedAttributes.Item(i);
                    if (!attr.Name.StartsWith("xmlns"))
                    {
                        Assert.AreEqual(attr.Value, actualNode.GetAttribute(attr.Name), expected.Describe() + "/@" + attr.Name);
                    }
                    checkedActualAttributes.Remove(attr.Name);
                }
                Assert.IsTrue(checkedActualAttributes.Count == 0, "Extra attributes present in actual node: " + actual.Describe() + ", "
                              + StringUtils.Join(checkedActualAttributes, ", "));
                if (expected.IsLeaf())
                {
                    Assert.AreEqual(GetTextValue(expectedNode, false).Trim(), GetTextValue(actualNode, false).Trim(), expected.Describe() + "/text()"
                                    );
                    if (expectedNode.FirstChild != null && actualNode.FirstChild != null)
                    {
                        Assert.AreEqual(expectedNode.FirstChild.NodeType, actualNode.FirstChild.NodeType, expected.Describe() + " nodeType");
                    }
                }
            }
            AssertHasNoMoreElements(actual);
        }