目次


RSS と Atom を使用したニュース・シンジケーションの実装

コンテンツのシンジケーションで RSS 2.0 と Atom 1.0 を使用するための便利なリファレンス

Comments

コンテンツ・シンジケーションと RSS 2.0 フォーマットの仕様、および Atom 1.0 フォーマットの仕様について少なくとも基本概念を理解していれば、そのいずれか、または両方を使用して、ニュース・シンジケーション・システムの実装に取り掛かることができます。この記事は、その際の便利なリファレンスになるはずです。

RSS と Atom によるシンジケーション

RSS と Atom は、類似した XML ベースの文書フォーマットであり、フィードとして知られる関連情報のリストを記述します。これらのフィードは、多くのアイテムで構成されており、それぞれのアイテムには添付されたメタデータの拡張可能なセットがあります (例えば、各アイテムにはタイトルがあります)。フィードの主な目的は、ウェブログやニュース見出しなどの Web コンテンツを Web サイトやユーザー・エージェントに直接シンジケーションすることです。

RSS 2.0 と Atom 1.0 の 2 つの例

リスト 1. RSS 2.0 フィードの例
<?xml version="1.0"?>
<rss version="2.0">

<channel>
<title>Feed Title</title>
<link>http://yourwebsite.com/</link>
<description>Feed Description</description>
<language>en-us</language>
<pubDate>Mon, 03 Jan 2005 12:00:00 GMT</pubDate>

<item>
<title>Article Title</title>
<link>http://yourwebsite.com/articlelink.html</link>
<description>Your content included here.</description>
</item>
<item>
<title>Sports</title>
<link>http://yourwebsite.com/sportslink.html</link>
<description>Your content included here.</description>
</item>

</channel>
</rss>
リスト 2. Atom 1.0 フィードの例
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

<title> Feed Title </title> 
<link href=" http://yourwebsite.com/"/>
<updated>2003-12-13T18:30:02Z</updated>
<author> 
<name>Your Name</name>
</author> 
<id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>

<entry>
<title>Article Title</title>
<link href=" http://yourwebsite.com/articlelink.html "/>
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
<updated>2003-12-13T18:30:02Z</updated>
<summary>Some text.</summary>
</entry>
<entry>
<title>Sports</title>
<link href=" http://yourwebsite.com/sportslink.html "/>
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344e45ab90</id>
<updated>2003-12-14T13:30:55Z</updated>
<summary>Some text.</summary>
</entry>

</feed>

RSS フィードと Atom フィードの類似点

前の 2 つの例 (リスト 1リスト 2) からわかるように、RSS と Atom はよく似た XML ベースのフォーマットです。ノードの表現が少し異なる以外は、この 2 つの基本的な構成は同じです。

各フィード・ファイルは、実際にはチャネルを表しています。フィードにはチャネルのタイトル、リンク、説明、作成者などが含まれます。チャネル情報はフィードについての基本的な情報を提供します。チャネル情報の後にいくつかのアイテムがあります。各アイテムは、フィード・リーダーから読み取ることができる実際のニュースや記事を表しています。通常、アイテムにはタイトル、リンク、更新日、および要約情報が含まれます。

RSS フィードと Atom フィードの相違点

「RSS 2.0 and Atom 1.0, Compared」を参考に、RSS と Atom の違いを確認します。

表 1. RSS 2.0 と Atom 1.0 の比較
相違点RSS 2.0Atom 1.0
デプロイメントRSS 2.0 は広く普及しています。Atom 1.0 はあまり広く普及していません。
仕様RSS 2.0 仕様はハーバード大学に著作権があり、確定しています。Atom 1.0 仕様は、IETF の Atompub Working Group によって承認されていますが、将来改訂される可能性があります。
必要なコンテンツRSS 2.0 では、フィードごとに title、link、および description が必要です。個々の item フィールドがフィード内に存在する必要はありません。Atom 1.0 では、feed と entry の両方に title (空でも可能)、固有の識別子、最終更新タイムスタンプが必要です。
ペイロードRSS 2.0 にはテキストまたはエスケープした HTML を記述できます。ただし、この 2 つのどちらを記述するかは指定できません。Atom 1.0 にはペイロード・コンテナーがあります。
コンテンツの全部または一部RSS 2.0 には、エントリーの全文または要約を記述できる <description> 要素があります。コンテンツが完全なものかどうかを示す方法は組み込まれていません。Atom 1.0 には、独立した <summary> 要素と <content> 要素が用意されています。コンテンツがテキストではなかったり、ローカルにない場合は、アクセシビリティーのために summary を適切に使用できます。
自動検出RSS 2.0 の自動検出は別の方法で実装されます。Atom 1.0 の自動検出は標準化されています。
抽出と集約RSS 2.0 で唯一認識されるフォームは <rss> 文書のみです。Atom 1.0 では、スタンドアロンの Atom Entry 文書が可能で、任意のネットワーク・プロトコル (XMPP など) を使って転送できます。また、Atom は集約されたフィードをサポートしています。集約されたフィードでは、エントリーが他のフィードに含まれる場合、エントリーは元のフィードをポイントしています。

RSS と Atom による公開システムの一般的なアーキテクチャー

RSS と Atom フォーマットの仕様が整備されて洗練されるにつれ、ますます多くの Web アプリケーションが実装されるようになっています。RSS または Atom を使用して最も普及した典型的な実装はニュースの公開システムです。

ここでは、RSS フィードと ATOM フィードの両方を使用した公開システムを実装するための一般的なアーキテクチャーについて説明します。このアーキテクチャーは次の 3 つの部分から構成されます。

  • フィード生成サブシステム
  • フィード操作サブシステム
  • 自動公開サブシステム

それでは、この 3 つのサブシステムの詳細をそれぞれ見ていきます。

フィード・ジェネレーター

フィード・ジェネレーターは、XML ベースのフィード・ファイルの生成を行います。フィード・ジェネレーターのクラス図は次のとおりです。

図 1. フィード・ジェネレーターのクラス図
図 1. フィード・ジェネレーターのクラス図
図 1. フィード・ジェネレーターのクラス図

フィード・ジェネレーターのコアは FeedFileManager クラスです。このクラスにより、特定のフィードに関連する XML ファイルが生成されます。フィードには具体的に AtomFeed と RssFeed の 2 種類があります。この 2 つのフィードのクラスの両方に、フィード・チャネル・クラスとフィード・アイテム・クラスがあります。フィード・チャネル・クラスとフィード・アイテム・クラスの実装は、それぞれの構成が異なるため、違ったものになるでしょう。

フィード操作サブシステム

フィード操作サブシステムには、AtomFeed と RssFeed の 2 種類のフィード・ファイルを処理するためのフィード操作用の関数がいくつか用意されています。たとえば、insertItem()、deleteItem()、updateItem() という関数があります。フィード操作サブシステムのクラス図は次のとおりです。

図 2. フィード操作サブシステムのクラス図
図 2. フィード操作サブシステムのクラス図
図 2. フィード操作サブシステムのクラス図

まず、2 つのフィード Publisher のいずれかを生成するために抽象ファクトリー・パターン PublisherFactory が必要です。次に、Publisher は DataCollection クラスを使用してデータベースからデータを抽出します。

自動公開サブシステム

自動公開サブシステムは、フィード・ファイルを一定の時間で更新するためのタイマーです。ここで前述の 2 つのサブシステムを実際に活用し、公開システムを機能させます。

図 3. 自動公開サブシステムのクラス図
図 3. 自動公開サブシステムのクラス図
図 3. 自動公開サブシステムのクラス図

RSS フィードと ATOM フィードを自動生成するための詳細な手順

ここでは、詳細な実装手順を 1 つずつ見ていきます。まず、図 4 は一般的な実装手順の図です。いくつかの主要な構成ブロックとそれぞれの関係が示されています。

図 4. 実装手順の概要
図 4. 実装手順の概要
図 4. 実装手順の概要

アプリケーション全体が大きなタイマーなので、内部で一定の起動時刻を設定できます。その時刻になると、タイマーによってスケジュール済みの仕事、つまりフィード・ファイルの生成が開始されます。アプリケーションはまず XML ファイルを生成し、次に RSS フィードと Atom フィードを構成します。最後に、これらのフィードを作成済みの XML ファイルに書き込みます。フィードのソースとして考えられるのは、データベース、ファイル、またはその他の様々なリソースです。

タイマー

タイマーは公開システムの中心です。タイマーは、ユーザーが行った予約に従って、または 1 日の決まった時間にフィード・ファイルを生成するようシステムを起動します。Java アプリケーションの場合、通常は Java の標準スケジューリング・クラス Timer と TimerTask を使用すると、繰り返し実行されるスケジュール・タスクを実装できます。

この公開システムで繰り返しのスケジュール・タスクを作成することは、とても一般的なことです。繰り返しのスケジュール・タスクを作成する詳細な手順については、 「Javaアプリケーションで繰り返しタスクをスケジューリングする」を参照してください。

リスト 3. タイマー起動メソッドの例
public void start() {
SchedulerTask st = new SchedulerTask(){
public void run() {
try {
updateNewsFeeds(); //concrete method of update feed files.
updateBooksFeeds();
... 
} catch (Exception e) {
e.printStackTrace();
}
}
};

XML ベースのフィード・ファイルの生成

RSS フィードと ATOM フィードはどちらも XML ベースのファイルなので、これらのファイルの生成が実装手順では重要になります。フィード・ジェネレーター・サブシステムの FeedFileManager クラスがこの作業を行います。

図 5. FeedFileManager クラス
図 5. FeedFileManager クラス

通常、このクラスには createFeedFile() メソッドが含まれます。このメソッドでは次の 3 つの処理を行う必要があります。

  • XML ファイルを作成する。このために createXMLFile() という静的メソッドを作成します。
  • 「フィード操作サブシステム」と対話して、関連チャネルとアイテム情報を作成する。
  • その情報すべてを XML ファイルに書き込む。
public String createFeedFile(String channelid, String name, String type)
throws Exception {
...
createXMLFile(file, type);

IPublishable publisher = PublisherFactory.createPublisher(type, file);
Feed feed = getFeed(type);

Channel channel = feed.getChannel();
ArrayList itemlist = feed.getItemList();

publisher.insertChannel(channel);
publisher.insertItemList(itemlist);
publisher.writeback(file);

return file;
}

RSS/Atom フィードの構成

前の手順で、PbulisherFactory は Publisher を作成し、特定のフィードに関連するチャネル情報とアイテムリストを挿入しています。

リスト 5. チャネルとアイテムリストの挿入コードの例
publisher.insertChannel(channel);
publisher.insertItemList(itemlist);

正しいチャネルとアイテムリストを構成するには、データベースからデータを抽出し、抽出したデータをフィード・パターンに入れます。データを抽出し、その情報を関連するデータビーンに挿入する方法を次に示します。

リスト 6. フィード用コードの例
...
NewsBeanManager newsmanager = new NewsBeanManager();
newslist = newsmanager.getAllNews(); //interact with database
...
for (Iterator it = newslist.iterator(); it.hasNext(); it.next()) {

title = "News " + i + ": " + ((NewsBean) newslist.get(i)).getTitle();
link = ((NewsBean) newslist.get(i)).getLink();
author = ((NewsBean) newslist.get(i)).getAuthor();
timestamp = ((NewsBean) newslist.get(i)).getPublishTime();
id = String.valueOf(((NewsBean) newslist.get(i)).getNewsID());
description = ((NewsBean) newslist.get(i)).getSummary();
content = ((NewsBean) newslist.get(i)).getContent();
rssitem = new RssItem(title, link, author, timestamp, id,
		description);
rssitemlist.add(i, rssitem);
atomitem = new AtomItem(title, link, author, timestamp, id,
		description, content);
atomitemlist.add(i, atomitem); 
i++;
}

実装のヒント

ニュース公開システムを正しく実装したら、デプロイメントでは次のヒントを参考にしてください。

最も一般的なフィード・リーダー用の RSS または Atom フィードの実装

最も一般的なフィード・リーダーの要件に合わせるため、これらのフィード・ファイルの生成時に次の点に注意してください。

  • RSS と Atom のバージョン情報を XML ファイルの先頭に追加する (リスト 7 を参照)。
    リスト 7. RSS と Atom のバージョン情報を追加するコードの例
    <?xml version="1.0" encoding="utf-8"?>   
    <rss version="2.0">
    ...
    <?xml version="1.0" encoding="utf-8"?>   
    <atom version="1.0">
  • RSS と Atom チャネルのリンク情報を設定する。RSS 2.0 ではリンク情報をノードとして設定しますが、Atom 1.0 では属性として設定します。チャネルに対してリンク情報を設定することをお勧めしますが、Atom ではリンクは必須アイテムではありません (リスト 8 を参照)。
リスト 8. チャネルに対してリンク情報を設定するコードの例
<?xml version="1.0" encoding="utf-8" ??> 
<rss?>
<channel?>
<title?>News Syndication</title?> 
<link?>http://www.newssyndication.com</link?> 
<description?>this is a news feed</description?> 
...

<?xml version="1.0" encoding="utf-8" ??> 
<feed xmlns="http://www.w3.org/2005/Atom"?>
<title?>News Syndication</title> 
<link href="http://www.newssyndication.com" /?> 
<updated?>2006-07-06T10:26:30Z</updated?> 
<id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id?>

XML ファイル生成時のグローバリゼーション・サポート

XML ファイルのヘッダーにエンコード情報を追加します。

リスト 9. XML ファイルのヘッダーにエンコード情報を追加するコードの例
<?xml version="1.0" encoding="utf-8"?>

XML ファイルを書き込む関数を実装するときは、FileWriter ではなく OutputStreamWriter を使用してエンコードを utf-8 に設定します。FileWriter のデフォルトのエンコードは GBK です。

リスト 10. OutputStreamWriter でエンコードを utf-8 に設定するコードの例
OutputStreamWriter writer = new OutputStreamWriter(outputstream,"utf-8");

まとめ

この記事では、まず RSS フィードと Atom フィードの類似点と相違点を確認しました。次に、両方のフィードを使用して公開システムを実装するためのアーキテクチャーを見てきました。このアーキテクチャーは、相互関係を持ちながら機能する 3 つのサブシステムで構成されます。1 つ 1 つ説明してから、実装手順に役立つヒントを確認しました。ニュース・フィードの合理的な方法を大いに活用してください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, XML, Open source
ArticleID=237588
ArticleTitle=RSS と Atom を使用したニュース・シンジケーションの実装
publish-date=09262006