Visual C# を使用して XPathNavigator クラスを使用して XML ドキュメントを移動する

この記事では、オブジェクトから作成されたオブジェクトを使用して XPathNavigator XML ドキュメントを移動する XPathDocument 方法について説明します。

元の製品バージョン: Visual C#
元の KB 番号: 308343

概要

このサンプルでは、XML データを含むオブジェクトを XPathDocument 読み込み、オブジェクトを XPathNavigator ビューとしてデータに作成し、ドキュメント内を歩いて XML を表示します。

この記事では、次の Microsoft .NET Framework クラス ライブラリ名前空間について説明します。

  • System.Xml
  • System.Xml.XPath

この記事の Microsoft Visual Basic .NET バージョンについては、「 Visual Basic を使用して XPathNavigator クラスを使用して XML を移動する方法」を参照してください。

要件

この記事では、次のトピックについて理解していることを前提としています。

  • Visual C#
  • XML 用語
  • XML ファイルの作成と読み取り
  • XML パス言語 (XPath) 構文

XPathNavigator クラスを使用して XML を移動する方法

  1. Visual Studio で新しい Visual C# コンソール アプリケーションを作成します。

    注:

    この例では、 という名前のファイル Books.xml使用します。 独自の Books.xml ファイルを作成することも、.NET Software Development Kit (SDK) クイック スタートに含まれているサンプルを使用することもできます。 クイック スタートがインストールされておらず、インストールしたくない場合は、ダウンロード場所のBooks.xml参照セクションを参照してください。 クイック スタートがインストールされている場合、 Books.xml は次のフォルダーにあります。
    \Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB

    Books.xml は、このプロジェクトを\Bin\Debug作成したフォルダーの下にあるフォルダーにコピーできます。

  2. プロジェクトが名前空間を System.Xml 参照していることを確認します。

  3. コードの using 後半で Xml これらの名前空間の宣言を修飾する必要がないように、 および XPath 名前空間の ステートメントを使用します。 ステートメントは、次のように、他の宣言の前に使用 using できます。

    using System.Xml;
    using System.Xml.XPath;
    
  4. 適切な変数を宣言します。 XML ドキュメントを XPathDocument 保持するオブジェクトと、式を XPathNavigator 評価 XPath してドキュメント内を移動するオブジェクトを宣言します。 式を String 保持するオブジェクトを XPath 宣言します。 Module1 のプロシージャに宣言コードを Main 追加します。

    XPathNavigator nav;
    XPathDocument docNav;
    
  5. サンプル ファイルをXPathDocument使用して オブジェクトBooks.xml読み込みます。 クラスでは XPathDocument 、拡張スタイルシート言語変換 (XSLT) を使用して、XML ドキュメント処理用の高速でパフォーマンス指向のキャッシュを提供します。 これは XML ドキュメント オブジェクト モデル (DOM) に似ていますが、XSLT 処理と XPath データ モデル用に高度に最適化されています。

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. ドキュメントからオブジェクトを XPathNavigator 作成します。 XPathNavigator を使用すると、XML ドキュメント内の属性ノードと名前空間ノードの両方を移動できます。

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. メソッドを使用してドキュメントのルートに MoveToRoot 移動します。 MoveToRoot は、ノードのツリー全体を含むドキュメント ノードにナビゲーターを設定します。

    //Initial XPathNavigator to start at the root.
    nav.MoveToRoot();
    
  8. メソッドを MoveToFirstChild 使用して、XML ドキュメントの子に移動します。 メソッドは MoveToFirstChild 、現在のノードの最初の子に移動します。 Books.xml ソースがある場合は、ルート ドキュメントから子、コメント セクション、および書ストア ノードに移動します。

    //Move to the first child node (comment field).
    nav.MoveToFirstChild();
    
  9. メソッドを MoveToNext 使用して、兄弟レベルでノードを反復処理します。 メソッドは MoveToNext 、現在のノードの次の兄弟に移動します。

    //Loop through all of the root nodes.
    do
    {
    } while (nav.MoveToNext());
    
  10. プロパティを NodeType 使用して、要素ノードのみを処理していることを確認し、 プロパティを Value 使用して要素のテキスト表現を表示します。

    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 the children.
                do
                {
                    //Display the data.
                    Console.Write("The XML string for this child ");
                    Console.WriteLine("is '{0}'", nav.Value);
                } while (nav.MoveToNext());
            }
        }
    } while (nav.MoveToNext());
    
  11. ノードに HasAttributes 属性があるかどうかを判断するには、 プロパティを使用します。 など、他のメソッドを使用して属性に移動し、 MoveToNextAttributeその値を調べることもできます。

    注:

    このコード セグメントでは、ツリー全体ではなく、ルート ノードの子孫についてのみ説明します。

    do
    {
       //Find the first element.
       if (nav.NodeType == XPathNodeType.Element)
       {
            //if children exist
            if (nav.HasChildren == true)
            {
                //Move to the first child.
                nav.MoveToFirstChild();
                //Loop through all 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());
    
  12. オブジェクトの ReadLine メソッドを Console 使用して、コンソールディスプレイの最後に一時停止を追加して、上記の結果をより簡単に表示します。

    //Pause.
    Console.ReadLine();
    
  13. Visual C# プロジェクトをビルドして実行します。

完全なコード一覧

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

namespace q308343
{
    class Class1
    {
        static void Main(string[] args)
        {
            XPathNavigator nav;
            XPathDocument docNav;

            docNav = new XPathDocument(@"c:\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();
        }
    }
}

トラブルシューティング

コードをテストすると、次の例外エラー メッセージが表示されることがあります。

System.Xml 型の未処理の例外。XmlException が system.xml.dll で発生しました
追加情報: 予期しない XML 宣言。 XML 宣言はドキュメント内の最初のノードである必要があり、その前に空白文字を表示することはできません。 1 行目、位置

例外エラーは、次のコード行で発生します。

docNav = new XPathDocument("c:\\books.xml");

このエラーを解決するには、books.xml ドキュメントの最初のノードの前にある空白文字を削除します。

関連情報