File: System\Xml\XPath\Internal\ChildrenQuery.cs
Web Access
Project: src\src\libraries\System.Private.Xml\src\System.Private.Xml.csproj (System.Private.Xml)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Xml.XPath;
 
namespace MS.Internal.Xml.XPath
{
    internal class ChildrenQuery : BaseAxisQuery
    {
        private XPathNodeIterator _iterator = XPathEmptyIterator.Instance;
 
        public ChildrenQuery(Query qyInput, string name, string prefix, XPathNodeType type) : base(qyInput, name, prefix, type) { }
        protected ChildrenQuery(ChildrenQuery other) : base(other)
        {
            _iterator = Clone(other._iterator);
        }
 
        public override void Reset()
        {
            _iterator = XPathEmptyIterator.Instance;
            base.Reset();
        }
 
        public override XPathNavigator? Advance()
        {
            while (!_iterator.MoveNext())
            {
                XPathNavigator? input = qyInput.Advance();
                if (input == null)
                {
                    return null;
                }
                if (NameTest)
                {
                    if (TypeTest == XPathNodeType.ProcessingInstruction)
                    {
                        _iterator = new IteratorFilter(input.SelectChildren(TypeTest), Name);
                    }
                    else
                    {
                        _iterator = input.SelectChildren(Name, Namespace!);
                    }
                }
                else
                {
                    _iterator = input.SelectChildren(TypeTest);
                }
                position = 0;
            }
            position++;
            currentNode = _iterator.Current;
            return currentNode;
        } // Advance
 
        public sealed override XPathNavigator? MatchNode(XPathNavigator? context)
        {
            if (context != null)
            {
                if (matches(context))
                {
                    XPathNavigator temp = context.Clone();
                    if (temp.NodeType != XPathNodeType.Attribute && temp.MoveToParent())
                    {
                        return qyInput.MatchNode(temp);
                    }
                    return null;
                }
            }
            return null;
        }
 
        public override XPathNodeIterator Clone() { return new ChildrenQuery(this); }
    }
}