コンテンツ・シンジケーションと RSS 2.0 フォーマットの仕様、および Atom 1.0 フォーマットの仕様について少なくとも基本概念を理解していれば、そのいずれか、または両方を使用して、ニュース・シンジケーション・システムの実装に取り掛かることができます。この記事は、その際の便利なリファレンスになるはずです。
RSS と Atom は、類似した XML ベースの文書フォーマットであり、フィードとして知られる関連情報のリストを記述します。これらのフィードは、多くのアイテムで構成されており、それぞれのアイテムには添付されたメタデータの拡張可能なセットがあります (例えば、各アイテムにはタイトルがあります)。フィードの主な目的は、ウェブログやニュース見出しなどの Web コンテンツを Web サイトやユーザー・エージェントに直接シンジケーションすることです。
リスト 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>
|
前の 2 つの例 (リスト 1 とリスト 2) からわかるように、RSS と Atom はよく似た XML ベースのフォーマットです。ノードの表現が少し異なる以外は、この 2 つの基本的な構成は同じです。
各フィード・ファイルは、実際にはチャネルを表しています。フィードにはチャネルのタイトル、リンク、説明、作成者などが含まれます。チャネル情報はフィードについての基本的な情報を提供します。チャネル情報の後にいくつかのアイテムがあります。各アイテムは、フィード・リーダーから読み取ることができる実際のニュースや記事を表しています。通常、アイテムにはタイトル、リンク、更新日、および要約情報が含まれます。
「RSS 2.0 and Atom 1.0, Compared」を参考に、RSS と Atom の違いを確認します。
表 1. RSS 2.0 と Atom 1.0 の比較
| 相違点 | RSS 2.0 | Atom 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. フィード・ジェネレーターのクラス図
フィード・ジェネレーターのコアは FeedFileManager クラスです。このクラスにより、特定のフィードに関連する XML ファイルが生成されます。フィードには具体的に AtomFeed と RssFeed の 2 種類があります。この 2 つのフィードのクラスの両方に、フィード・チャネル・クラスとフィード・アイテム・クラスがあります。フィード・チャネル・クラスとフィード・アイテム・クラスの実装は、それぞれの構成が異なるため、違ったものになるでしょう。
フィード操作サブシステムには、AtomFeed と RssFeed の 2 種類のフィード・ファイルを処理するためのフィード操作用の関数がいくつか用意されています。たとえば、insertItem()、deleteItem()、updateItem() という関数があります。フィード操作サブシステムのクラス図は次のとおりです。
図 2. フィード操作サブシステムのクラス図
まず、2 つのフィード Publisher のいずれかを生成するために抽象ファクトリー・パターン PublisherFactory が必要です。次に、Publisher は DataCollection クラスを使用してデータベースからデータを抽出します。
自動公開サブシステムは、フィード・ファイルを一定の時間で更新するためのタイマーです。ここで前述の 2 つのサブシステムを実際に活用し、公開システムを機能させます。
図 3. 自動公開サブシステムのクラス図
RSS フィードと ATOM フィードを自動生成するための詳細な手順
ここでは、詳細な実装手順を 1 つずつ見ていきます。まず、図 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();
}
}
};
|
RSS フィードと ATOM フィードはどちらも XML ベースのファイルなので、これらのファイルの生成が実装手順では重要になります。フィード・ジェネレーター・サブシステムの 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;
} |
前の手順で、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 ファイルのヘッダーにエンコード情報を追加します。
リスト 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 つ説明してから、実装手順に役立つヒントを確認しました。ニュース・フィードの合理的な方法を大いに活用してください。
学ぶために
- 「What is Atom?」: Atom のクイック・スタート・ガイドを入手してください。
-
「RSS 2.0 and ATOM 1.0, Compared」: RSS 2.0 と Atom 1.0 の相違点に関する詳細な情報が得られます。
-
「RSS 2.0 Specification」: 必要な情報はすべて仕様で入手してください。
-
「RSS and Atom feeds」: developerWorks の総合サイトを調べ終わったら、自分の RSS フィードと Atom フィードを構築してください。
-
「RSS Tutoria」: RSS の概要、RSS の歴史、独自に実行する方法を学習できます。
-
「Workplace RSS feeds and blogs」: Workplace ディスカッション・フォーラム、Workplace 製品サポート・ページ、developerWorks Workplace 記事、および developerWorks Workplace チュートリアルから最新情報を入手してください。
-
「Javaアプリケーションで繰り返しタスクをスケジューリングする」(Tom White, developerWorks, 2003年11月): Java 言語の Timer クラスについてはこの概要に目を通してください。
-
developerWorks Web development ゾーン: Web テクノロジー関連の記事やチュートリアルで自分のサイト開発スキルをみがいてください。
-
developerWorks technical events and webcasts: 情報がたくさん詰まった技術セッションで最新情報を入手してください。学習期間を短縮し、最も困難なソフトウェア・プロジェクトの品質を高め、結果を向上させることができます。
製品や技術を入手するために
- 皆さんの次期開発プロジェクトを、IBM trial software を使って構築してください。developerWorks から直接ダウンロードすることができます。
議論するために
-
developerWorks ブログ: developerWorks コミュニティに参加してください。
