読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

Linq入門記-86 (LINQ to XML, XPath, XPathSelectElements, XPathEvaluate)

LINQ to XMLでのXPathの利用について.

過去の内容は以下から見れます。よろしければご参照くださいませ。


今回は、LINQ to XMLにてXPathを利用する方法についてです.
場合によっては、XPathを利用した方が楽に取得できる事も多いのでやっぱり便利です。


XPathを使用する際に利用するメソッドは以下のものです。

  • XPathSelectElements
  • XPathEvaluate


上記メソッドは拡張メソッドとなっており、本体は以下のクラスに定義されています。

System.Xml.Linq.Extensions


XPathSelectElementsメソッドは、名前の通り合致するXElementのシーケンスを返します。
XPathEvaluateは、通常のXPath式を評価する場合と同じように利用できます。
戻り値がobjectになることに注意。


尚、利用するにはSystem.Xml.XPathをusingしておく必要があります。


以下、サンプルです。

namespace Gsf.Samples
{
  using System;
  using System.Collections;
  using System.Collections.Generic;
  using System.Linq;
  using System.Xml.Linq;
  using System.Xml.XPath;

  #region LinqSamples-82
  /// <summary>
  /// LINQ to XMLのサンプルです.
  /// </summary>
  /// <remarks>
  /// XPath(System.Xml.XPath.Extensions)のサンプルです.
  /// LINQ to XMLとXPathの比較については
  ///   http://msdn.microsoft.com/ja-jp/library/vstudio/bb675178.aspx
  /// に詳細に記載されている.
  /// </remarks>
  public class LinqSamples82 : IExecutable
  {
    public void Execute()
    {
      //
      // XPathSelectElements
      //   XPath式を評価して、XElementを取得する
      //
      // LINQ to XMLには、XPath用の拡張メソッドが定義されたクラスが存在するため
      // それを利用する。以下のクラスである.
      //   System.Xml.XPath.Extensions
      // 尚、利用するにはSystem.Xml.XPathをusingしておく必要がある.
      //
      var root = BuildSampleXml();

      // XPath指定
      foreach (var elem in root.XPathSelectElements("Book/Title"))
      {
        Console.WriteLine("Value:{0}, Type:{1}", elem, elem.GetType().Name);
      }

      // XPath指定
      foreach (var elem in root.XPathSelectElements("//Title"))
      {
        Console.WriteLine("Value:{0}, Type:{1}", elem, elem.GetType().Name);
      }

      Console.WriteLine("=====================================");

      // LINQ to XML
      foreach (var elem in root.Elements("Book").Elements("Title"))
      {
        Console.WriteLine(elem);
      }

      // LINQ to XML
      foreach (var elem in root.Descendants("Title"))
      {
        Console.WriteLine(elem);
      }

      Console.WriteLine("=====================================");

      //
      // XPathEvaluate
      //   XPath式を評価して、結果を取得する
      //
      // LINQ to XMLには、XPath用の拡張メソッドが定義されたクラスが存在するため
      // それを利用する。以下のクラスである.
      //   System.Xml.XPath.Extensions
      // 尚、利用するにはSystem.Xml.XPathをusingしておく必要がある.
      //
      // XPathEvaluateメソッドは、戻り値がobjectになることに注意。
      //
      root = BuildSampleXml();

      // XPath指定
      foreach (var elem in (IEnumerable)root.XPathEvaluate("Book[@id=\"bk102\"]/PublishDate"))
      {
        Console.WriteLine("Value:{0}, Type:{1}", elem, elem.GetType().Name);
      }

      Console.WriteLine("=====================================");

      // LINQ to XML
      var query = from book in root.Elements("Book")
                  where book.Attribute("id").Value == "bk102"
                  select book.Element("PublishDate");

      foreach (var elem in query)
      {
        Console.WriteLine(elem);
      }
    }

    XElement BuildSampleXml()
    {
      //
      // サンプルXMLファイル
      //  see: http://msdn.microsoft.com/ja-jp/library/vstudio/ms256479(v=vs.90).aspx
      //
      return XElement.Load(@"xml/Books.xml");
    }
  }
  #endregion
}


実行すると以下のようになります。

  Value:<a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a> Developer's Guide, Type:XElement
  Value:Midnight Rain, Type:XElement
  Value:<a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a> Developer's Guide, Type:XElement
  Value:Midnight Rain, Type:XElement
  =====================================
  <a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a> Developer's Guide
  Midnight Rain
  <a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a> Developer's Guide
  Midnight Rain
  =====================================
  Value:2000-12-16, Type:XElement
  =====================================
  2000-12-16


以下、参考リソースです.


================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。