.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

 さて、本稿ではこの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各バージョンのフォーマットについては、本稿の範囲を超えるのでここでは割愛する。興味のある方は、以下のサイトを参照いただくとよいだろう。

バージョン 公開先のURL
0.90 http://my.netscape.com/publish/formats/rss-0.9.dtd
0.91 http://my.netscape.com/publish/formats/rss-spec-0.91.html
1.0 http://www.net.intap.or.jp/INTAP/s-web/data/TR/1-2.html
2.0 http://blogs.law.harvard.edu/tech/rss
3.0 http://www.aaronsw.com/2002/rss30
RSS各バージョンの仕様書
ちなみにRSSと同じ目的で新たに作成された「Atomフィード」というものがあり、ブログやRSSリーダーではすでにこれに対応してあるものも多い。しかし現時点のAtom 0.8フォーマットでは、その仕様がまだ完全には固まっていない(最終草案の状態)。Atomフォーマットについて興味がある場合には、「The Atom Syndication Format」を参照してほしい。

 さて、以上が理解できたら、さっそくサンプル・プログラムをブラウザから起動してみよう。以下のようなXML文書が表示されれば成功だ。

Internet Explorerから見たサンプル・プログラムの実行結果

 もっともRSSは本来、インターネット・ブラウザから参照するためのものではない。実際には「RSSリーダー(または、RSSアグリゲータ)」と呼ばれる専用のクライアント・アプリケーションから参照することで、きちんと整形されたサイト・サマリの一覧を参照できる。例えば、以下は代表的なRSSリーダーである「Sharp Reader」からRSSフィード(上記のWebフォーム)を参照したところだ。

Sharp Readerから見たサンプル・プログラムの実行結果

 なお、昨今では、Sharp Readerのほかにも、有償/無償を問わずさまざまなRSSリーダーが公開されている。例えば、.NETで開発されたRSSリーダーでは、オープン・ソースの「Rss Bandit」などがある。主要なRSSリーダーについては、以下のサイトで紹介されている。

 このサイトを参考に自分に合ったRSSリーダーを選ぶとよいだろう。End of Article

カテゴリ:Webフォーム 処理対象:RSS
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]RSSフィードをWebフォームで読み込み表示するには?
RSS 2.0/ATOM 1.0フィードを処理するには?
[ASP.NET]ユーザー・コントロールでパーソナライズ可能なWebパーツを作成するには?
[ASP.NET]PropertyGridEditorPartコントロールでカスタム・プロパティを編集するには?
[ASP.NET]DataGridコントロールでデータセットを表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間