次の方法で共有


Visual C で XPath 式を使用して XML にクエリを実行する#

この記事では、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 に対してクエリを実行する

  1. 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 サブフォルダーにコピーできます。

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

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

    using System.Xml;
    using System.Xml.XPath;
    
  4. 適切な変数を宣言します。 XML ドキュメントを保持する XPathDocument オブジェクト、XPath 式を評価する XpathNavigator オブジェクト、および選択したノードを反復処理する XPathNodeIterator オブジェクトを宣言します。 XPath 式を保持する String オブジェクトを宣言します。 Class1Main関数に宣言コードを追加します。

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

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. ドキュメントから XPathNavigator を作成します。 XPathNavigator オブジェクトは、読み取り専用の XPath クエリに使用されます。 XPath クエリは、結果の値または多数のノードを返す場合があります。

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. 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)";
    
  8. 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));
    
  9. XPath 式を作成して、10 ドルを超えるすべての書籍を検索します。 この XPath 式は、XML ソースから Title ノードのみを返します。

    // Find the title of the books that are greater then $10.00.
    strExpression = "/bookstore/book/title[../price>10.00]";
    
  10. 選択されたノードとXPathNavigatorSelect メソッドを組み合わせてXPathNodeIteratorを作成します。 XPathNodeIteratorは XPath ノードセットを表し、このノードセットに対する操作をサポートします。

    // Select the node and place the results in an iterator.
    NodeIter = nav.Select(strExpression);
    
  11. 選択したノード間を移動するには、XPathNavigatorSelect メソッドから返されたXPathNodeIteratorを使用します。 この場合は、XPathNodeIteratorMoveNext メソッドを使用して、選択したすべてのノードを反復処理できます。

    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);
    };
    
  12. ReadLineメソッドを使用して、コンソールディスプレイの最後に一時停止を追加して、前の手順の結果をより簡単に表示します。

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

    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 処理命令を削除します。