private XmlNodeOrder Compare( XmlNode node1, XmlNode node2 ) {
Debug.Assert( node1 != null );
Debug.Assert( node2 != null );
Debug.Assert( node1 != node2, "Should be handled by ComparePosition()" );
//Attribute nodes come before other children nodes except namespace nodes
Debug.Assert( OwnerNode(node1) == OwnerNode(node2) );
if (node1.XPNodeType == XPathNodeType.Attribute) {
if (node2.XPNodeType == XPathNodeType.Attribute) {
XmlElement element = ((XmlAttribute)node1).OwnerElement;
if (element.HasAttributes) {
XmlAttributeCollection attributes = element.Attributes;
for (int i = 0; i < attributes.Count; i++) {
XmlAttribute attribute = attributes[i];
if (attribute == node1) {
return XmlNodeOrder.Before;
}
else if (attribute == node2) {
return XmlNodeOrder.After;
}
}
}
return XmlNodeOrder.Unknown;
}
else {
return XmlNodeOrder.Before;
}
}
if (node2.XPNodeType == XPathNodeType.Attribute) {
return XmlNodeOrder.After;
}
//neither of the node is Namespace node or Attribute node
XmlNode nextNode = node1.NextSibling;
while ( nextNode != null && nextNode != node2 )
nextNode = nextNode.NextSibling;
if ( nextNode == null )
//didn't meet node2 in the path to the end, thus it has to be in the front of node1
return XmlNodeOrder.After;
else
//met node2 in the path to the end, so node1 is at front
return XmlNodeOrder.Before;
}