この記事では、XML Path Language (XPath) 式と XPathNavigator クラスを使用して、XPathDocument オブジェクトに対してクエリを実行する方法について説明します。
XPath は、プログラムによって式を評価し、ドキュメント内の特定のノードを選択するために使用されます。
この記事では、Microsoft .NET Framework クラス ライブラリ名前空間 ( System.Xml.XPath) について説明します。
適用対象: Visual Studio、.NET Framework
元の KB 番号: 308333
[前提条件]
この記事では、次のトピックについて理解していることを前提としています。
- Visual C#
- XML の用語
- XML ファイルの作成と読み取り
- XPath 構文
XPath 式を持つ XPathDocument に対してクエリを実行する
Microsoft Visual Studio で、Visual C# コンソール アプリケーションを作成します。
Note
この例では、 Books.xmlという名前のファイルを使用します。 独自の Books.xml ファイルを作成することも、.NET Software Development Kit (SDK) クイックスタートに含まれているサンプルを使用することもできます。
クイック スタートがインストールされておらず、インストールしたくない場合は、Books.xml のダウンロード場所に関する「関連コンテンツ」セクションを参照してください。
クイック スタートがインストールされている場合、Books.xml ファイルは
Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transforxml\VBフォルダーにあります。 このファイルは、このプロジェクトを作成したフォルダーの\Bin\Debugサブフォルダーにコピーできます。プロジェクトが
System.Xml名前空間を参照していることを確認します。usingおよびXml名前空間でXPathステートメントを使用して、コードの後半でこれらの名前空間の宣言を修飾する必要がないようにします。 次のように、他の宣言の前にusingステートメントを使用できます。using System.Xml; using System.Xml.XPath;適切な変数を宣言します。 XML ドキュメントを保持する
XPathDocumentオブジェクト、XPath 式を評価するXpathNavigatorオブジェクト、および選択したノードを反復処理するXPathNodeIteratorオブジェクトを宣言します。 XPath 式を保持するStringオブジェクトを宣言します。Class1のMain関数に宣言コードを追加します。XPathNavigator nav; XPathDocument docNav; XPathNodeIterator NodeIter; String strExpression;XPathDocumentをサンプルファイル Books.xmlと共にロードします。XPathDocumentクラスは、拡張スタイルシート言語変換 (XSLT) を使用して、XML ドキュメント処理用の高速でパフォーマンス指向のキャッシュを提供します。 これは XML ドキュメント オブジェクト モデル (DOM) に似ていますが、XSLT 処理とXPathデータ モデル用に高度に最適化されています。// Open the XML. docNav = new XPathDocument(@"c:\books.xml");ドキュメントから
XPathNavigatorを作成します。XPathNavigatorオブジェクトは、読み取り専用の XPath クエリに使用されます。 XPath クエリは、結果の値または多数のノードを返す場合があります。// Create a navigator to query with XPath. nav = docNav.CreateNavigator();XPath 式を作成して、書籍の平均コストを見つけます。 この XPath 式は 1 つの値を返します。 XPath 構文の詳細については、「参照」セクションの 「XPath 構文 」を参照してください。
// Find the average cost of a book. // This expression uses standard XPath syntax. strExpression = "sum(/bookstore/book/price) div count(/bookstore/book/price)";XPath 式を評価するには、
EvaluateオブジェクトのXPathNavigatorメソッドを使用します。Evaluateメソッドは、式の結果を返します。// Use the Evaluate method to return the evaluated expression. Console.WriteLine("The average cost of the books are {0}", nav.Evaluate(strExpression));XPath 式を作成して、10 ドルを超えるすべての書籍を検索します。 この XPath 式は、XML ソースから Title ノードのみを返します。
// Find the title of the books that are greater then $10.00. strExpression = "/bookstore/book/title[../price>10.00]";選択されたノードと
XPathNavigatorのSelectメソッドを組み合わせてXPathNodeIteratorを作成します。XPathNodeIteratorは XPath ノードセットを表し、このノードセットに対する操作をサポートします。// Select the node and place the results in an iterator. NodeIter = nav.Select(strExpression);選択したノード間を移動するには、
XPathNavigatorのSelectメソッドから返されたXPathNodeIteratorを使用します。 この場合は、XPathNodeIteratorのMoveNextメソッドを使用して、選択したすべてのノードを反復処理できます。Console.WriteLine("List of expensive books:"); //Iterate through the results showing the element value. while (NodeIter.MoveNext()) { Console.WriteLine("Book Title: {0}", NodeIter.Current.Value); };ReadLineメソッドを使用して、コンソールディスプレイの最後に一時停止を追加して、前の手順の結果をより簡単に表示します。// Pause Console.ReadLine();プロジェクトをビルドして実行します。
Note
結果はコンソール ウィンドウに表示されます。
トラブルシューティング
コードをテストすると、次の例外エラー メッセージが表示されることがあります。
An unhandled exception of type System.Xml.XmlException occurred in System.xml.dll
Additional information: System error.
この例外は、次のコード行で発生します。
docNav = new XPathDocument("c:\\books.xml");
このエラーは、無効な処理命令が原因で発生します。 たとえば、処理命令に余分なスペースが含まれている場合があります。 次の例は、無効な処理命令です。
<?xml version='1.0' ?>
例外を解決するには、次のいずれかの解決策を使用します。
無効な処理命令を修正します。 有効な処理命令の例を次に示します。
<?xml version='1.0'?>Books.xml ファイルから XML 処理命令を削除します。