Нужна ли пара MoveToParent () / MoveToFirstChild () с XPathNavigator? - PullRequest
2 голосов
/ 18 ноября 2011

Это пример использования XPathNavigator от Microsoft .

using System;
using System.Xml;
using System.Xml.XPath;

// http://support.microsoft.com/kb/308343
namespace q308343 { 
    class Class1 {
        static void Main(string[] args) {

            XPathNavigator nav; 
            XPathDocument docNav; 

            docNav = new XPathDocument(@"Books.Xml");
            nav = docNav.CreateNavigator();
            nav.MoveToRoot();

            //Move to the first child node (comment field).
            nav.MoveToFirstChild();

            do {
                //Find the first element.
                if (nav.NodeType == XPathNodeType.Element) {
                    //Determine whether children exist.
                    if (nav.HasChildren == true) {

                        //Move to the first child.
                        nav.MoveToFirstChild();

                        //Loop through all of the children.
                        do {
                            //Display the data.
                            Console.Write("The XML string for this child ");
                            Console.WriteLine("is '{0}'", nav.Value);

                            //Check for attributes.
                            if (nav.HasAttributes == true) {
                                Console.WriteLine("This node has attributes");
                            }
                        } while (nav.MoveToNext()); 
                    }
                }
            } while (nav.MoveToNext()); 
            //Pause.
            Console.ReadLine();
        }
    }
}

Я думаю, что в этом коде есть ошибка, из-за которой он не выполняет MoveToParent(), чтобы подняться на один уровенькогда нет элементов для отображения.

nav.MoveToFirstChild();

//Loop through all of the children.
do {
    ....
} while (nav.MoveToNext()); 

nav.MoveToParent(); <-- This seems to be missing.

Однако, когда я компилирую / выполняю этот пример, он отлично работает с nav.MoveToParent().

Is MoveToParent () / MoveToFirstChild () пара необходима с XPathNavigator?Можно ли не использовать MoveToParent(), потому что второе выполнение MoveToNext() работает как MoveToParent(), когда первое выполнение MoveToNext() возвращает false?

1 Ответ

3 голосов
/ 18 ноября 2011

В этом коде, после того, как мы пройдем все дочерние элементы корневого узла, больше не нужно ничего делать, не может быть более одного корневого узла.Поэтому нет необходимости MoveToParent(), мы можем просто выйти.Именно это и делает код.

...