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 を移動する方法
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
作成したフォルダーの下にあるフォルダーにコピーできます。プロジェクトが名前空間を
System.Xml
参照していることを確認します。コードの
using
後半でXml
これらの名前空間の宣言を修飾する必要がないように、 およびXPath
名前空間の ステートメントを使用します。 ステートメントは、次のように、他の宣言の前に使用using
できます。using System.Xml; using System.Xml.XPath;
適切な変数を宣言します。 XML ドキュメントを
XPathDocument
保持するオブジェクトと、式をXPathNavigator
評価XPath
してドキュメント内を移動するオブジェクトを宣言します。 式をString
保持するオブジェクトをXPath
宣言します。 Module1 のプロシージャに宣言コードをMain
追加します。XPathNavigator nav; XPathDocument docNav;
サンプル ファイルを
XPathDocument
使用して オブジェクトBooks.xml読み込みます。 クラスではXPathDocument
、拡張スタイルシート言語変換 (XSLT) を使用して、XML ドキュメント処理用の高速でパフォーマンス指向のキャッシュを提供します。 これは XML ドキュメント オブジェクト モデル (DOM) に似ていますが、XSLT 処理と XPath データ モデル用に高度に最適化されています。// Open the XML. docNav = new XPathDocument(@"c:\books.xml");
ドキュメントからオブジェクトを
XPathNavigator
作成します。XPathNavigator
を使用すると、XML ドキュメント内の属性ノードと名前空間ノードの両方を移動できます。// Create a navigator to query with XPath. nav = docNav.CreateNavigator();
メソッドを使用してドキュメントのルートに
MoveToRoot
移動します。MoveToRoot
は、ノードのツリー全体を含むドキュメント ノードにナビゲーターを設定します。//Initial XPathNavigator to start at the root. nav.MoveToRoot();
メソッドを
MoveToFirstChild
使用して、XML ドキュメントの子に移動します。 メソッドはMoveToFirstChild
、現在のノードの最初の子に移動します。 Books.xml ソースがある場合は、ルート ドキュメントから子、コメント セクション、および書ストア ノードに移動します。//Move to the first child node (comment field). nav.MoveToFirstChild();
メソッドを
MoveToNext
使用して、兄弟レベルでノードを反復処理します。 メソッドはMoveToNext
、現在のノードの次の兄弟に移動します。//Loop through all of the root nodes. do { } while (nav.MoveToNext());
プロパティを
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());
ノードに
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());
オブジェクトの
ReadLine
メソッドをConsole
使用して、コンソールディスプレイの最後に一時停止を追加して、上記の結果をより簡単に表示します。//Pause. Console.ReadLine();
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 ドキュメントの最初のノードの前にある空白文字を削除します。
関連情報
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示