|
|
連載:実践! 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 記事ランキング
本日
月間