« プログラム言語 Axum | メイン | Liunq to XML 入門 その3 (Linq クエリ構文) »

2009年05月14日

Linq to XML 入門その2 (基本的ななクエリー)

それでは、Linqでの基本的なクエリーの方法について説明していきます。

今回はXMLデータとして、このBlogのRSS 2.0フィードを利用します。

では、まずRSSを表示してみましょう。

   1: XDocument rss = XDocument.Load(@"http://www.isisaka.com/blog/index.xml");
   2: Console.WriteLine(rss.Declaration);
   3: //Console.WriteLine(rss.FirstNode);
   4: Console.WriteLine(rss);
   5:  

その表示結果の一部。

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <rss version="2.0">
   3:   <channel>
   4:     <title>OPC Diary</title>
   5:     <link>http://www.isisaka.com/blog/</link>
   6:     <description>私的ソフトウェア開発あれこれ。</description>
   7:     <language>ja</language>
   8:     <copyright>Copyright 2009</copyright>
   9:     <lastBuildDate>Thu, 14 May 2009 10:47:36 +0900</lastBuildDate>
  10:     <generator>http://www.sixapart.com/movabletype/</generator>
  11:     <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  12:     <item>
  13:       <title>プログラム言語 Axum</title>
  14:       <description><![CDATA[<p><a href="http://msdn.microsoft.com/en-us/devlabs/dd795202.aspx">Axum</a></p>  <p>.NET Framework上でEr
  15: langっぽい(ぽいねあくまでも)並列言語実行環境を提供するプログラミング言語。Erlangっぽいので、基本的にメッセージパッシングで実行単位(Age
  16: ntというらしい)間でデータ交換を行うようだ。</p>  <p>これがこのまま製品化するとは思わないけど、まぁF#の例もあるので、案外化けるかもだ。素
  17: 直に考えればC#に取り込まれていくんだろうけど。</p>]]></description>
  18:       <link>http://www.isisaka.com/blog/archives/2009/05/_axum.html</link>
  19:       <guid>http://www.isisaka.com/blog/archives/2009/05/_axum.html</guid>
  20:       <category domain="http://www.sixapart.com/ns/types#category">.NET</category>
  21:       <category domain="http://www.sixapart.com/ns/types#category">オブジェクト指向・システム開発</category>
  22:       <pubDate>Thu, 14 May 2009 10:47:36 +0900</pubDate>
  23:     </item>

RSSフィードを受信して、表示できる事が確認できたでしょうか。

では、このデータからBlog記事の投稿日とタイトルの一覧を作りたいと思います。

RSS 2.0ではitemエレメントに各Blog記事のデータが入っています。

   1: XDocument rss = XDocument.Load(@"http://www.isisaka.com/blog/index.xml");
   2: //XMLの木構造をたどって目的のElementに到達するやり方
   3: var query = from x in rss.Element("rss").Elements("channel").Elements("item")
   4:             select x;
   5: foreach (var i in query) {
   6:     DateTime pubDate = DateTime.Parse(i.Element("pubDate").Value);
   7:     Console.WriteLine(pubDate.ToString() + "\t: " + i.Element("title").Value);
   8: }
   9:  

1行目ではRSSフィードを取り出しています。

3行目でLinqを使いRSSフィードからitemエレメントを取り出します。ここではRoorのrssエレメントから純にRSSの木構造たどってitemeエレメントまでを指定し検索もとを絞っています。itemエレメントは一つとは限らないのでElementsとして指定します。

5行目以降では検索結果をもとに更新日とタイトルをリスト表示します。

この様に特定のエレメントを検索対象とするには性格に木構造をたどる形で指定していく必要があり、その木構造が深いと指定するのが大変です。

そこで、Linq to XMLではDescendantsでエレメント名を指定すれば木構造をたどらずにダイレクトに指定する事が出来ます。(Descendantの意味は子孫)

   1: XDocument rss = XDocument.Load(@"http://www.isisaka.com/blog/index.xml");
   2: //Descendantsを使う方法
   3: var query = from x in rss.Descendants("item")
   4:             select x;
   5: foreach (var i in query) {
   6:     DateTime pubDate = DateTime.Parse(i.Element("pubDate").Value);
   7:     Console.WriteLine(pubDate.ToString() + "\t: " + i.Element("title").Value);
   8: }

先ほどと変わったのは3行目です。かなりスッキリ書けるようになったのがわかると思います。

   1: 2009/05/14 10:47:36     : プログラム言語 Axum
   2: 2009/05/11 19:03:02     : 第2回静岡 IT Pro 勉強会のご案内
   3: 2009/05/10 21:53:00     : 第30回 NT-Committee2関東勉強会
   4: 2009/05/10 21:21:41     : プリンタを買いました。(HP C309a)
   5: 2009/05/10 9:57:29      : キヤノン インクジェットプリンタのヘッド交換ができないので買い換えてやる!
   6: 2009/05/10 8:20:50      : そろそろCorei7かな。。
   7: 2009/05/10 0:06:41      : デザイナー目線でのFlash vs. Silverlight(2)
   8: 2009/05/09 15:42:19     : Linq to XML 入門その1 (XML文書の作り方)
   9: 2009/05/08 12:16:11     : Japan Windows Server : Hyper-V Server R2 Release Candidate 公開
  10: 2009/05/08 7:34:02      : Windows 7 向けリモートサーバ管理ツール
  11: 2009/05/06 23:34:56     : exFATはやはりブートメディアを作ることはできない
  12: 2009/05/05 15:48:55     : Vistaの供給は2011年1月まで、メインストリームサポートは2012年4月までらしい
  13: 2009/05/05 15:12:37     : Windows 7 RC アメリカでは一般公開
  14: 2009/05/04 23:32:40     : Windows 7(x64) をVirtualBoxに入れてみた。
  15: 2009/05/02 6:43:33      : プログラミングに適したフォント

表示結果はこうなります。

それでは、where句を使った条件検索を試してみます。

以下のコードでは5/11以降に更新された記事のリストを表示するようにします。

   1: XDocument rss = XDocument.Load(@"http://www.isisaka.com/blog/index.xml");
   2: //Descendantsを使う方法
   3: var query = from x in rss.Descendants("item")
   4:             where DateTime.Parse(x.Element("pubDate").Value) > DateTime.Parse("2009/5/11")
   5:             select x;
   6: foreach (var i in query) {
   7:     DateTime pubDate = DateTime.Parse(i.Element("pubDate").Value);
   8:     Console.WriteLine(pubDate.ToString() + "\t: " + i.Element("title").Value);
   9: }

4行目のwhere句で5/11以降のデータのみ抽出するようにしています。

以下が実行結果です。

   1: 2009/05/14 10:47:36     : プログラム言語 Axum
   2: 2009/05/11 19:03:02     : 第2回静岡 IT Pro 勉強会のご案内

11日以降に投稿した記事のリストが表示されています。

今回はここまで。

RSSを加工したい事はよくあるので、少しぐらいは参考になったでしょうか。

次回はもう少し複雑なクエリについて説明したいと思っています。ただ、データを作るのが難儀なのでしばらくお待ちください。。。

トラックバック

このエントリーのトラックバックURL:
http://www.isisaka.com/blog/mt-tb.cgi/3160

このリストは、次のエントリーを参照しています: Linq to XML 入門その2 (基本的ななクエリー):

» Linq to XML 入門その1 (XML文書の作り方) from OPC Diary
準備 これから数回に分けてLinq to XMLの基礎的な使い方についてまとめ... [続きを読む]

コメント

 

コメントしてください




保存しますか?


                 あわせて読みたい
クリエイティブ・コモンズ・ライセンス
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.