次の方法で共有


Coding4Fun - 単純な RSS フィード

単純な RSS フィード

Peter Bernhardt
3Leaf Development

ずいぶん昔のことになりますが、私は自分には世の中のすべてを知り尽くす術はないという現実的な結論に達しました。何でも知り得ると考えたこと自体が厚かましい話なのですが、そんな傲慢も若気の至りというもので、今ならもう少し分別があります。実際、この現実はインターネット時代に入って重みを増すばかりで、Web 上の絶え間ない情報、思考、意見の流れについていくことは神業といっても過言ではありません。私のささやかな関心分野を見ても、Visual Basic、Visual C#、.NET Framework の最新の開発事情に常に通じていることは生易しくありません。

そこで、これから数回にわたって、既におなじみの RSS (Really Simple Syndication) - 過剰な情報の把握を格段に簡素化するテクノロジ - を使ったさまざまな方法を紹介していきます。

入門辞典であるウィキペディアでは、RSS を次のように説明しています。「Web コンテンツの短い説明とそのコンテンツの全文へのリンク。この情報は RSS フィード、Web フィード、RSS ストリーム、または RSS チャネルと呼ばれる XML ファイル形式で提供されます。シンジケーションの簡素化のほか、RSS には Web サイトを頻繁に閲覧するユーザーがニュース アグリゲータでサイトの更新を追跡できる機能もあります。」(全文は、ウィキペディアの RSS (英語) を参照してください。)

最初に、Visual Web Developer 2005 Express Edition で作成可能な単純な RSS フィード リーダーを紹介します。ここでは、目的のサイトからの RSS フィードをフェッチし、そのコンテンツを Web ページでの表示用に編集するコントロールを作成します。もちろん、RSS フィード リーダーを Windows アプリケーションとして構築することもできますし、個人使用が目的でコンテンツをアグリゲートする場合には、RSS Reader (英語) や SharpReader (英語) などの無償提供されている RSS クライアント アプリケーションを利用することも可能です。Web アプリケーションでのシンジケート コンテンツの用途は多様ですが、自作のコンテンツの表現力を高め、サイト閲覧者に操作しやすい環境を提供する機能があります。

コードの説明に入る前に、一般的な RSS 2.0 ファイルのスニペットを示しておきます。この例では、シンジケーションのプロバイダは Microsoft の MSDN Web サイトであり、Visual Basic コンテンツ専用のフィードを使用しています。

  <rss
  xmlns:msdn="https://msdn.microsoft.com/aboutmsdn/rss/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:msdndomain="https://msdn.microsoft.com/aboutmsdn/rss/domains"
  version="2.0">
  <channel>
    <title>MSDN: Visual Basic</title>
    <link>https://msdn.microsoft.com/vbasic/</link>
    <description>Recently Published Visual Basic Content</description>
    <language>en-us</language>
    <pubDate>Thu, 30 Jun 2005 13:01:02 GMT</pubDate>
    <lastBuildDate>Thu, 30 Jun 2005 13:01:02 GMT</lastBuildDate>
    <generator>MSDN RSS Service 1.1.0.0</generator>
    <ttl>1440</ttl>
    <item>
      <title>June CTP of Visual Studio 2005 Available to MSDN Subscribers</title>
      <description>The latest Community Technical Preview of Visual Studio 2005 is
       now available for download to MSDN subscribers.</description>
      <link>https://msdn.microsoft.com/subscriptions/</link>
      <category domain="msdndomain:ContentType">Announcement</category>
      <category domain="msdndomain:Subject">.NET development</category>
      <msdn:headlineImage>http://msdn.microsoft.comicons/article.gif</msdn:headlineImage>
      <msdn:contentType>Announcement</msdn:contentType>
      <msdn:simpleDate>Jun 27</msdn:simpleDate>
      <guid isPermaLink="false">Titan_1106</guid>
      <pubDate>Tue, 28 Jun 2005 02:00:13 GMT</pubDate>
    </item>
    <!-- more items follow -->
 </channel>
</rss>

一般的なフィード ファイルに読み込まれる情報の中には、すべてのシンジケーション プロバイダが一様には使用しない情報もあります。たとえば、MSDN のヘッドラインの画像は標準的なものではありません。XML 構造の先頭は、コンテンツの項目リストの紹介に使用するタイトルと説明を挿入する <channel> ノードです。<channel> ノードには、コンテンツの各記事 (記事のタイトル、説明、発行日、記事の全文へのリンクなど) を示す複数の子 <item> ノードが含まれます。

ここでは、Visual Web Developer 2005 Express Edition で新規 Web サイトを作成後、この情報の表示に使用する Web ユーザー コントロールを追加します。

ハリッハするよ拡大画像が表示され?す

(画像をクリックすると拡大表示されます)

ASP.NET 2.0 の機能の 1 つに、Visual Studio 2003 開発者にはなじみ深い分離コード モデルと、.aspx または .ascx ファイルの <script> タグ内にすべてのコードを記述できる新機能のインライン コードのサポートがあります。インライン コードを使用しても ASP.NET ページの動作はまったく変わりませんが、筆者は分離コード モデルの方が好きなので、この例では分離コードを使用します。このアプリケーションのコードを Visual Basic で記述していることもお気付きでしょう。

デザイナで、[Repeater] コントロールをコントロールに追加しました。Repeater は、データをカスタム レイアウトで表示するデータ バインド コントロールです。このコントロールは、RSS フィードからのコンテンツ項目の一覧を表示するのに適しています。次に示すように、コントロールに関連付けられたスマート タグ メニューを使用して、デザイン時にコントロールのデータ ソースを設定できますが、このアプリケーションでは、データ ソースの設定は実行時に RSS フィードで行います。

ハリッハするよ拡大画像が表示され?す

(画像をクリックすると拡大表示されます)

.ascx ファイルの分離コード ファイル (RSSList.ascx.vb) に切り替えて、RSS フィードの取得に必要なクラスが存在する名前空間の Imports ステートメントを追加し、Repeater にバインドするローカル リソースに格納します。

  
    Imports System.Net
Imports System.Data

コントロールの Page Load イベントのイベント ハンドラを使用するほか、プライベート ヘルパ関数 RefreshFeed を追加します。これにより RSS データを取得し、DataSet として Page Load イベント ハンドラに返します。RefreshFeed 関数の最初の 1 行では、WebRequest クラスの共有関数 Create で、HttpWebRequest オブジェクトのインスタンスを生成しています。

  
    Dim rssFeed As HttpWebRequest = DirectCast(WebRequest.Create _
("https://msdn.microsoft.com/vbasic/rss.xml"), HttpWebRequest)

Create 関数の入力引数として、RSS フィードのターゲット URL を渡します。この関数を実行すると、HttpWebRequest オブジェクトが返されます。このオブジェクトは、HTTP でサーバーと通信するための追加プロパティおよびメソッドを持つ特殊な WebRequest オブジェクトです。この例での HttpWebRequest の処理は単純です。まず、GetResponse でサーバーから応答を取得すれば、応答が XML 形式であるため、応答ストリーム (GetResponseStream) を、入力引数に Stream を指定する ReadXml メソッド オーバーロードで直接 DataSet に読み込むことが可能です。

  
    Dim rssData As DataSet = New DataSet()
rssData.ReadXml(rssFeed.GetResponse().GetResponseStream())

ReadXml メソッドでは、XML データのスキーマが自動的に推測されます。そのため、ソース XML データの <channel> ノードおよび <items> ノードは DataSet 内でそれぞれ別の DataTable として示されます。Page Load イベント ハンドラでは、RefereshFeed メソッドを呼び出して RSS フィード データを保持する DataSet を取得した後、チャネル データおよび項目データをさまざまな方法で操作します。DataSet の 2 番目の DataTable はチャネル情報を保持しています。このフィードのタイトルと説明を表示するため、DataTable の最初の 1 行のみを Row の ItemArray プロパティで Object 配列にコピーします。次に、適切なデータ列を探すため、タイトルの列と説明の列の位置を表す序数値を整数 (Integer) 型のローカル変数にそれぞれ割り当てます。これらの値を使用して Object 配列の GetValue メソッドを呼び出し、各列に関連付けられた値をクラスに定義された Friend フィールドに格納します (例では、これらの値を Repeater コントロールで使用します)。

  
    Dim channelItems As Object() = rssData.Tables(1).Rows(0).ItemArray
Dim titleColumn As Integer = rssData.Tables(1).Columns("title").Ordinal
Dim descriptionColumn As Integer = rssData.Tables(1).Columns("description").Ordinal
Title = channelItems.GetValue(titleColumn).ToString()
Description = channelItems.GetValue(descriptionColumn).ToString()

次に、Repeater コントロールの DataSource プロパティを、RSS フィードからの項目コンテンツを保持する DataSet の DataTable に設定します。さらに、Repeater の DataBind メソッドを呼び出して、データ ソースをコントロールにバインドします。

  Repeater1.DataSource = rssData.Tables(2)
Repeater1.DataBind() 

RssFeed.ascx コントロールのソース ビューで Repeater コントロールのテンプレートを追加してデータを表示します。<HeaderTemplate> で、チャネルのタイトルと説明を示すヘッダー要素で始まる表を表示します。

  <HeaderTemplate>
<table border=0 style="width: 240px; font-size: x-small; color: black; font-family: Verdana;">
<thead>
<tr style="font-weight: bold;">
<td><%#Me.Title%></td>
</tr>
<tr style="font-style: italic;">
<td><%#Me.Description%></td>
</tr>
</thead>
</HeaderTemplate>

また、<ItemTemplate> で、コンテンツ項目のタイトルとそのタイトルに関連付けられたリンク、および項目の説明を表示します。

  
    <ItemTemplate>
   <tr bgcolor="LightBlue" >
       <td>
           <a target="article" style="text-decoration: none; color: black;"
            href=<%# DataBinder.Eval(Container.DataItem, "link") %>>
            <%# DataBinder.Eval(Container.DataItem, "title") %> </a>
        </td>
    </tr>
    <tr bgcolor="Ivory">
        <td style="color: CornFlowerBlue;">
           <%# DataBinder.Eval(Container.DataItem, "description") %>
        </td>
   </tr>
</ItemTemplate>

最後に必要な手順として、.ascx ページの先頭に OutputCache ディレクティブを追加して、コントロールの出力を 1 時間キャッシュします。

  
    <%@ OutputCache Duration="3600" VaryByParam="None" %>

これにより、このコントロールを使用しているページにユーザーがアクセスするたびに RefreshFeed 関数が実行されるのを防ぎます。この処理を行わないと、アクセスが多いサイトでは Web サーバーとシンジケーション プロバイダとの間のトラフィックが多くなります。このアプリケーションを実行すると、シンジケート コンテンツの表示は次のようになります。

ハリッハするよ拡大画像が表示され?す

(画像をクリックすると拡大表示されます)

今後の記事では、Web アプリケーションにシンジケート RSS フィードを使用する可能性についてさらに詳細に説明します。それまで、このコードをダウンロードして自分で試してみてください。

Peter Bernhardt はサンフランシスコのベイエリア在住のフリーのソフトウェア開発者および設計者です。Peter は、はるか昔に Word Basic を使い始めて以来の多年にわたる Microsoft テクノロジ ユーザーです。Peter の電子メール アドレスは peter@SharpSense.net (英語) です。