|
.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
|
|
Insider.NET 記事ランキング
本日
月間