.NET TIPS
[ASP.NET]データベースからRSSフィード情報を生成するには?
山田 祥寛
2005/06/03
RSS(RDF Site Summary)とは、その名のとおり、サイト・コンテンツのサマリ情報(主に新着記事情報やニュースなど)を配信するためのXMLフォーマットだ。昨今では、多くのニュース・サイトがRSS形式のヘッドライン情報を配信するようになってきたし、多くのブログ・ツールがRSSによる情報配信に対応していることから、RSSの普及度は急速に増しているように思われる(かくいう筆者のサイト「サーバサイド技術の学び舎 - WINGS 」でも関連書籍/記事情報をRSS配信しているので、興味のある方はご利用いただきたい)。今後登場予定のInternet Explorer 7.0ではRSSリーダーが標準で実装されるといわれており、そうなれば、RSSは今後、より一層幅広いユーザーに浸透していくだろう。
さて、本稿ではこのRSSフィードをASP.NETアプリケーションから動的に配信するためのサンプル・プログラムを紹介する。
なお、本サンプル・プログラムを利用する場合には、あらかじめデータベース・サーバ上に、以下のようなcontentsテーブルを作成しておく必要がある。このテーブルはRSS情報を作成するための元データを格納するためのものだ。
フィールド名
データ型
概要
title
VARCHAR(100)
記事タイトル
link
VARCHAR(255)
URL(主キー)
memo
VARCHAR(255)
記事概要
category
VARCHAR(50)
記事カテゴリ
updated
DATETIME
最終更新日
contentsテーブルのフィールド・レイアウト
それではさっそく、具体的なコードを眺めてみよう。このプログラムでは、データベースから取得した情報を、Repeaterコントロールを利用してXMLデータに整形しているところがポイントだ。
<?xml version="1.0" encoding="UTF-8" ?>
<%@ Page ContentType="text/xml" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
public void Page_Load(Object sender, EventArgs e){
SqlConnection objDb=new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
objDb.Open();
// contentsテーブルから最近の記事10件に関する「URL」を
// 取得し、Repeaterコントロールlinkにバインド
SqlCommand objLnk = new SqlCommand("SELECT TOP 10 link FROM contents ORDER BY updated DESC", objDb);
SqlDataReader objLnk_Rd = objLnk.ExecuteReader();
link.DataSource = objLnk_Rd;
link.DataBind();
objLnk_Rd.Close();
// contentsテーブルから最近の記事10件に関する「詳細情報」を
// 取得し、Repeaterコントロールrssにバインド
SqlCommand objItem = new SqlCommand("SELECT TOP 10 * FROM contents ORDER BY updated DESC", objDb);
SqlDataReader objItem_Rd = objItem.ExecuteReader();
rss.DataSource = objItem_Rd;
rss.DataBind();
objItem_Rd.Close();
objDb.Close();
}
</script>
<rdf:RDF xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja">
<channel rdf:about="http://www.wings.msn.to/">
<title>サーバサイド技術の学び舎 - WINGS</title>
<description>サーバサイド技術に関する最新情報を提供</description>
<link>http://www.wings.msn.to/</link>
<image rdf:resource="http://www.wings.msn.to/image/wings.jpg" />
<items>
<rdf:Seq>
<asp:Repeater id="link" runat="Server">
<ItemTemplate>
<rdf:li
rdf:resource="<%# DataBinder.Eval(Container.DataItem,"link") %>"
/>
</ItemTemplate>
</asp:Repeater>
</rdf:Seq>
</items>
</channel>
<image rdf:about="http://www.wings.msn.to/image/wings.jpg">
<title>サーバサイド技術の学び舎 - WINGS</title>
<url>http://www.wings.msn.to/image/wings.jpg</url>
<link>http://www.wings.msn.to/</link>
</image>
<asp:Repeater id="rss" runat="Server">
<ItemTemplate>
<item rdf:about="<%# DataBinder.Eval(Container.DataItem,"link") %>">
<title><%# DataBinder.Eval(Container.DataItem,"title") %></title>
<link><%# DataBinder.Eval(Container.DataItem,"link") %></link>
<description>
<%# DataBinder.Eval(Container.DataItem,"memo") %></description>
<category>
<%# DataBinder.Eval(Container.DataItem,"category") %></category>
<dc:creator />
<dc:date><%# DataBinder.Eval(Container.DataItem,"updated","{0:s}") %></dc:date>
</item>
</ItemTemplate>
</asp:Repeater>
</rdf:RDF>
データベースからRSSフィードを生成するWebフォーム(C#版:rssWriter_cs.aspx)
<?xml version="1.0" encoding="UTF-8" ?>
<%@ Page ContentType="text/xml" Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
Public Sub Page_Load(sender As Object, e As EventArgs)
Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
objDb.Open()
' contentsテーブルから最近の記事10件に関する「URL」を
' 取得し、Repeaterコントロールlinkにバインド
Dim objLnk As New SqlCommand("SELECT TOP 10 link FROM contents ORDER BY updated DESC", objDb)
Dim objLnk_Rd As SqlDataReader=objLnk.ExecuteReader()
link.DataSource = objLnk_Rd
link.DataBind()
objLnk_Rd.Close()
' contentsテーブルから最近の記事10件に関する「詳細情報」を
' 取得し、Repeaterコントロールrssにバインド
Dim objItem As New SqlCommand("SELECT TOP 10 * FROM contents ORDER BY updated DESC", objDb)
Dim objItem_Rd AS SqlDataReader=objItem.ExecuteReader()
rss.DataSource = objItem_Rd
rss.DataBind()
objItem_Rd.Close()
objDb.Close()
End Sub
</script>
<rdf:RDF xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja">
<channel rdf:about="http://www.wings.msn.to/">
<title>サーバサイド技術の学び舎 - WINGS</title>
<description>サーバサイド技術に関する最新情報を提供</description>
<link>http://www.wings.msn.to/</link>
<image rdf:resource="http://www.wings.msn.to/image/wings.jpg" />
<items>
<rdf:Seq>
<asp:Repeater id="link" runat="Server">
<ItemTemplate>
<rdf:li
rdf:resource="<%# DataBinder.Eval(Container.DataItem,"link") %>"
/>
</ItemTemplate>
</asp:Repeater>
</rdf:Seq>
</items>
</channel>
<image rdf:about="http://www.wings.msn.to/image/wings.jpg">
<title>サーバサイド技術の学び舎 - WINGS</title>
<url>http://www.wings.msn.to/image/wings.jpg</url>
<link>http://www.wings.msn.to/</link>
</image>
<asp:Repeater id="rss" runat="Server">
<ItemTemplate>
<item rdf:about="<%# DataBinder.Eval(Container.DataItem,"link") %>">
<title><%# DataBinder.Eval(Container.DataItem,"title") %></title>
<link><%# DataBinder.Eval(Container.DataItem,"link") %></link>
<description>
<%# DataBinder.Eval(Container.DataItem,"memo") %></description>
<category>
<%# DataBinder.Eval(Container.DataItem,"category") %></category>
<dc:creator />
<dc:date><%# DataBinder.Eval(Container.DataItem,"updated","{0:s}") %></dc:date>
</item>
</ItemTemplate>
</asp:Repeater>
</rdf:RDF>
データベースからRSSフィードを生成するWebフォーム(VB.NET版:rssWriter_vb.aspx)
冒頭で述べたように、RSSはXMLベースのファイル・フォーマットであるので、生成のロジックそのものに、取り立てて特筆すべき点はない。あらかじめ用意したRSSフォーマットのテンプレートに対して、データベースから取得したサイト情報をRepeaterコントロールにバインドしているだけの仕組みだ(本稿では、コード簡略化のために、チャネル情報(=<channel>要素の情報。詳細は下記の表を参照)はハード・コーディングしているが、もちろん、これらの情報もデータベースなどから取得することは可能だ)。
以下に、本稿サンプルで利用しているRSS 1.0フォーマットの主要要素について、簡単にまとめておこう。
要素名
概要
子要素
子要素の概要
<rdf:RDF>
RSS 1.0の最上位要素。各名前空間の宣言は必須
<channel>
チャネル情報全般を定義。チャネルを一意に識別するrdf:about属性は必須
<title>
チャネル・タイトル
<link>
サイトのトップページ
<description>
チャネルに関する簡単な記述
<image>
ロゴ・イメージ。rdf:resource属性は、下記トップ要素の<image>におけるrdf:about属性と等しくなければならない
<items>
チャネルに含まれるコンテンツ情報のリスト。<rdf:li>要素のrdf:resource属性は、下記トップ要素- 要素のrdf:about属性と等しくなければならない
<image>
ロゴ・イメージ
<title>
ロゴ・イメージの代替テキスト
<url>
ロゴ・イメージのURL
<link>
イメージからリンクするURL(通常はトップページ)
<item>
コンテンツ情報。rdf:about属性は一意であること
<title>
コンテンツのタイトル
<link>
コンテンツのURL
<description>
コンテンツの概要説明
RSS 1.0で利用可能な主要要素
ただし、RSSは、バージョンによってフォーマットが大きく異なるので、注意が必要だ。本稿では、最も標準的と思われるRSS 1.0をベースに紹介しているが、対象ユーザーによってはほかのバージョンにも対応する必要があるかもしれない。RSS各バージョンのフォーマットについては、本稿の範囲を超えるのでここでは割愛する。興味のある方は、以下のサイトを参照いただくとよいだろう。
さて、以上が理解できたら、さっそくサンプル・プログラムをブラウザから起動してみよう。以下のようなXML文書が表示されれば成功だ。
Internet Explorerから見たサンプル・プログラムの実行結果
もっともRSSは本来、インターネット・ブラウザから参照するためのものではない。実際には「RSSリーダー(または、RSSアグリゲータ)」と呼ばれる専用のクライアント・アプリケーションから参照することで、きちんと整形されたサイト・サマリの一覧を参照できる。例えば、以下は代表的なRSSリーダーである「Sharp Reader 」からRSSフィード(上記のWebフォーム)を参照したところだ。
Sharp Readerから見たサンプル・プログラムの実行結果
なお、昨今では、Sharp Readerのほかにも、有償/無償を問わずさまざまなRSSリーダーが公開されている。例えば、.NETで開発されたRSSリーダーでは、オープン・ソースの「Rss Bandit 」などがある。主要なRSSリーダーについては、以下のサイトで紹介されている。
このサイトを参考に自分に合ったRSSリーダーを選ぶとよいだろう。
generated by
RSSフィード
アイティメディアの提供サービス
ホワイトペーパー(TechTargetジャパン/閲覧には会員登録 が必要です)
スキルアップ/キャリアアップ(JOB@IT)
**先週の人気講座ランキング**
〜Windowsプログラミング編〜