|  |  | 
 
| 連載:実践! WCFプログラミング第1回 WCFを使用してRSS/Atomフィーダを作成するデジタルアドバンテージ 岸本 真二郎2008/06/27
 |  | 
| 
 | 
フィード本体の作成(どこから情報を持ってくるか)
 それでは、フィード本体の作成を行っていこう。今回はデータベース(SQL Server 2005)からフィード情報を取得することにする。
 データベースには「Syndication」というデータベースがあり、この中にフィードの概要が格納された「Feeds」テーブルと、Webサイトに含まれるページの更新(アイテム)情報が格納されている「Items」テーブルがあるものとする。FeedsテーブルとItemsテーブルは次のように定義した。
| 
 
| CREATE TABLE [dbo].[Feeds]([FeedID] [int] NULL,
 [FeedName] [nvarchar](50) NULL,
 [link] [varchar](50) NULL,
 [description] [nvarchar](50) NULL,
 [copyright] [nvarchar](50) NULL,
 [language] [varchar](50) NULL,
 [title] [nvarchar](50) NULL
 ) ON [PRIMARY]
 
 |  | 
| Feedsテーブルの定義 | 
| 
 
| CREATE TABLE [dbo].[Items]([itemID] [int] NOT NULL,
 [feedID] [int] NOT NULL,
 [title] [nvarchar](512) NULL,
 [description] [nvarchar](512) NULL,
 [pubDate] [datetime] NULL,
 [link] [varchar](512) NULL
 ) ON [PRIMARY]
 
 |  | 
| Itemsテーブルの定義 | 
■SyndicationFeedオブジェクトの作成
 ここでFeedsテーブルから(仮にFeedIDが1の)チャネル情報を取得するには、
| 
 
| SELECT * from Feeds WHERE FeedID=1
 |  | 
というクエリを実行する。
 フィード情報の設定には、このクエリの実行結果から得られる内容をSyndicationFeedクラスのインスタンスに設定する。ここではRSS 2.0のフィード情報のうち、title、description、link、generator、language、lastBuildDate(SyndicationFeedクラスのプロパティ名ではLastUpdatedTimeに対応)、copyrightを設定している。
| 
 
| cmd.CommandText = @"SELECT * from Feeds WHERE FeedID=1";SqlDataReader rdr = cmd.ExecuteReader();
 SyndicationFeed feed = null;
 
 if (rdr.Read()) {
 // フィードの基本情報を設定する
 feed = new SyndicationFeed(
 rdr["title"].ToString(),
 rdr["description"].ToString(),
 new Uri(rdr["link"].ToString()) );
 feed.Copyright = new TextSyndicationContent(
 rdr["copyright"].ToString());
 feed.Generator = ".NET Framework WCF";
 feed.Language = rdr["language"].ToString();
 feed.LastUpdatedTime = DateTime.Now;
 }
 rdr.Close();
 
 |  
 
| cmd.CommandText = "SELECT * from Feeds WHERE FeedID=1"Dim rdr As SqlDataReader = cmd.ExecuteReader()
 Dim feed As SyndicationFeed
 
 If (rdr.Read()) Then
 ' フィードの基本情報を設定する
 feed = New SyndicationFeed(rdr("title").ToString(), _
 rdr("description").ToString(), _
 New Uri(rdr("link").ToString()))
 feed.Copyright = New TextSyndicationContent(rdr("copyright").ToString())
 feed.Generator = ".NET Framework WCF"
 feed.Language = rdr("language").ToString()
 feed.LastUpdatedTime = DateTime.Now
 End If
 rdr.Close()
 
 |  | 
| リスト7  SyndicationFeedオブジェクトの作成(上:C#、下:VB) | 
■SyndicationItemオブジェクトの作成
 次にアイテムを格納する。Itemsテーブルから最新の20件の更新情報を取得するために次のクエリを実行する。
| 
 
| SELECT TOP 20 * FROM Items ORDER BY pubDate DESC, itemID
 |  | 
 そして、取得したレコード分だけ、SyndicationItemオブジェクトを追加する。事前にSyndicationItemオブジェクトのリスト(List<SyndicationItem>クラス)を用意しておき、itemsにアイテム情報(SyndicationItem)を追加する。
| 
 
| // アイテム情報を作成するList<SyndicationItem> items = new List<SyndicationItem>();
 cmd.CommandText = @"SELECT TOP 10 * FROM Items WHERE feedID=1 ORDER BY pubDate DESC, itemID";
 rdr = cmd.ExecuteReader();
 
 while (rdr.Read()) {
 string title = rdr["title"].ToString();
 string description = rdr["description"].ToString();
 Uri link = new Uri(rdr["link"].ToString());
 
 // 新しい配信アイテムを作成します。
 SyndicationItem item = new SyndicationItem(
 title, description, link);
 item.PublishDate = DateTime.Parse(rdr["pubDate"].ToString());
 items.Add(item); // リストに追加
 }
 rdr.Close();
 conn.Close();
 feed.Items = items; // フィードにリストをセット
 
 |  
 
| ' アイテム情報を作成するDim items As New List(Of SyndicationItem)()
 cmd.CommandText = "SELECT TOP 10 * FROM Items WHERE feedID=1 ORDER BY pubDate DESC, itemID"
 rdr = cmd.ExecuteReader()
 
 While (rdr.Read())
 Dim title As String = rdr("title").ToString()
 Dim description As String = rdr("description").ToString()
 Dim link As Uri = New Uri(rdr("link").ToString())
 
 ' 新しい配信アイテムを作成します。
 Dim item As SyndicationItem = New SyndicationItem(title, description, link)
 item.PublishDate = DateTime.Parse(rdr("pubDate").ToString())
 items.Add(item) ' リストに追加
 End While
 
 rdr.Close()
 conn.Close()
 feed.Items = items ' フィードにリストをセット
 
 |  | 
| リスト8  アイテムを追加する処理(上:C#、下:VB) | 
 以上の作業によって作成されたライブラリにより配信されたフィードの内容例を次に示す(RSS 2.0。件数は2件のみ)。
| 
 
| <?xml version="1.0" encoding="utf-8"?><rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
 <channel>
 <title>@IT</title>
 <link>http://www.atmarkit.co.jp/</link>
 <description>ITエンジニア対象の技術解説情報&コミュニティサイト</description>
 <language>jp-ja</language>
 <copyright>Copyright (c) 2000-2008, ITmedia Inc.</copyright>
 <lastBuildDate>Fri, 06 Jun 2008 15:53:56 +0900</lastBuildDate>
 <generator>.NET Framework WCF</generator>
 <item>
 <link>http://www.atmarkit.co.jp/news/200806/04/ibm.html</link>
 <title>IBM、中堅企業攻略にサーバ統合分析ツール「Zodiac」投入</title>
 <description>日本IBMは6月4日、中堅市場の拡大を目的にパートナー支援策を強化したと発表した。中堅企業を得意とするパートナーへの支援策を拡大し、「大企業向けのIBM」というイメージを変えたいという思いもある。</description>
 <pubDate>Wed, 04 Jun 2008 00:00:00 +0900</pubDate>
 </item>
 <item>
 <link>http://www.atmarkit.co.jp/news/200806/04/codezine.html</link>
 <title>はてブの技術情報だけを追いかけるサービス開始、翔泳社</title>
 <description>翔泳社は6月4日、同社が運営する開発者向けの媒体「Codezine」(コードジン)で、「開発者注目のはてなブックマーク@CodeZine」を開始した。</description>
 <pubDate>Wed, 04 Jun 2008 00:00:00 +0900</pubDate>
 </item>
 </channel>
 </rss>
 
 |  | 
| 出来上がったRSS 2.0フィードの内容の例 | 
 デバッグ実行した場合には、IEでは次のような表示になる。
|  
 | 
| デバッグ実行した結果 | 
|  | 
 ここまでの作業でRSS/Atomフィードを生成するWCFサービスの作成は完了である。
 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間