System.Xml.XPath.XPathNavigator.ComparePosition C# (CSharp) Method

ComparePosition() public method

public ComparePosition ( XPathNavigator nav ) : XmlNodeOrder
nav XPathNavigator
return XmlNodeOrder
        public virtual XmlNodeOrder ComparePosition(XPathNavigator nav)
        {
            if (nav == null)
            {
                return XmlNodeOrder.Unknown;
            }

            if (IsSamePosition(nav))
                return XmlNodeOrder.Same;

            XPathNavigator n1 = this.Clone();
            XPathNavigator n2 = nav.Clone();

            int depth1 = GetDepth(n1.Clone());
            int depth2 = GetDepth(n2.Clone());

            if (depth1 > depth2)
            {
                while (depth1 > depth2)
                {
                    n1.MoveToParent();
                    depth1--;
                }
                if (n1.IsSamePosition(n2))
                    return XmlNodeOrder.After;
            }

            if (depth2 > depth1)
            {
                while (depth2 > depth1)
                {
                    n2.MoveToParent();
                    depth2--;
                }
                if (n1.IsSamePosition(n2))
                    return XmlNodeOrder.Before;
            }

            XPathNavigator parent1 = n1.Clone();
            XPathNavigator parent2 = n2.Clone();

            while (true)
            {
                if (!parent1.MoveToParent() || !parent2.MoveToParent())
                    return XmlNodeOrder.Unknown;

                if (parent1.IsSamePosition(parent2))
                {
                    if (n1.GetType().ToString() != "Microsoft.VisualStudio.Modeling.StoreNavigator")
                    {
                        Debug.Assert(CompareSiblings(n1.Clone(), n2.Clone()) != CompareSiblings(n2.Clone(), n1.Clone()), "IsSamePosition() on custom navigator returns incosistent results");
                    }
                    return CompareSiblings(n1, n2);
                }

                n1.MoveToParent();
                n2.MoveToParent();
            }
        }

Usage Example

Example #1
0
        public int Compare(object o1, object o2)
        {
            XPathNavigator nav1 = o1 as XPathNavigator;
            XPathNavigator nav2 = o2 as XPathNavigator;

            if (nav1 == null)
            {
                return(-1);
            }
            if (nav2 == null)
            {
                return(1);
            }
            switch (nav1.ComparePosition(nav2))
            {
            case XmlNodeOrder.Same:
                return(0);

            case XmlNodeOrder.After:
                return(1);

            default:
                return(-1);
            }
        }
All Usage Examples Of System.Xml.XPath.XPathNavigator::ComparePosition