| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- //------------------------------------------------------------------------------
- // <copyright file="TreeIterator.cs" company="Microsoft">
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // </copyright>
- // <owner current="true" primary="true">Microsoft</owner>
- // <owner current="true" primary="false">Microsoft</owner>
- //------------------------------------------------------------------------------
- #pragma warning disable 618 // ignore obsolete warning about XmlDataDocument
- namespace System.Xml {
- using System.Diagnostics;
- // Iterates over non-attribute nodes
- internal sealed class TreeIterator : BaseTreeIterator {
- private XmlNode nodeTop;
- private XmlNode currentNode;
- internal TreeIterator( XmlNode nodeTop ) : base( ((XmlDataDocument)(nodeTop.OwnerDocument)).Mapper ) {
- Debug.Assert( nodeTop != null );
- this.nodeTop = nodeTop;
- this.currentNode = nodeTop;
- }
- internal override void Reset() {
- currentNode = nodeTop;
- }
- internal override XmlNode CurrentNode {
- get {
- return currentNode;
- }
- }
- internal override bool Next() {
- XmlNode nextNode;
- // Try to move to the first child
- nextNode = currentNode.FirstChild;
- // No children, try next sibling
- if ( nextNode != null ) {
- currentNode = nextNode;
- return true;
- }
- return NextRight();
- }
- internal override bool NextRight() {
- // Make sure we do not get past the nodeTop if we call NextRight on a just initialized iterator and nodeTop has no children
- if ( currentNode == nodeTop ) {
- currentNode = null;
- return false;
- }
- XmlNode nextNode = currentNode.NextSibling;
- if ( nextNode != null ) {
- currentNode = nextNode;
- return true;
- }
- // No next sibling, try the first sibling of from the parent chain
- nextNode = currentNode;
- while ( nextNode != nodeTop && nextNode.NextSibling == null )
- nextNode = nextNode.ParentNode;
- if ( nextNode == nodeTop ) {
- currentNode = null;
- return false;
- }
- currentNode = nextNode.NextSibling;
- Debug.Assert( currentNode != null );
- return true;
- }
- }
- }
|