連載:実践! WCFプログラミング

第1回 WCFを使用してRSS/Atomフィーダを作成する

デジタルアドバンテージ 岸本 真二郎
2008/06/27
Page1 Page2 Page3 Page4

フィード本体の作成(どこから情報を持ってくるか)

 それでは、フィード本体の作成を行っていこう。今回はデータベース(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サービスの作成は完了である。


 INDEX
  実践! WCFプログラミング
  第1回 WCFを使用してRSS/Atomフィーダを作成する
    1.WCFとは?/RSS/Atomとは?
    2.RSS/Atomフィーダのプログラミング
  3.フィード本体の作成
    4.実際にどのように配信するか?/IISでフィードを配信する
 
インデックス・ページヘ  「実践! WCFプログラミング」


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 記事ランキング

本日 月間