フィードは、ニュース・アーカイブやブログのような Web アプリケーションのデータを配信するために使われます。下記のフィード (リスト 1) には潜在的な問題があり、あるエントリーの id がどこかで重複している可能性があります。もし、この重複によって現在のエントリーが上書きされないとすると、このフィードはシンジケーション上に重複したコンテンツを作成します。
リスト 1. オリジナルのフィード
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>
<id>http://www.example.com/myblog/index.html</id>
<updated>2007-01-10T17:23:36.222-08:00</updated>
<title type='text'>MyBlog updates</title>
<link rel='alternate' type='text/html'
href='http://www.example.com/myblog/index.html'></link>
<link rel='next' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/default?start-index=26&max-results=2
5'></link>
<link rel='self' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/default'></link>
<author><name>tsa</name></author>
<generator version='1.01' uri='http://www.example.com'>Example
Blogerator</generator>
<openSearch:totalResults>2</openSearch:totalResults>
<openSearch:startIndex>1</openSearch:startIndex>
<entry>
<id>http://www.example.com/myblog/posts/55</id>
<published>2007-01-10T17:21:00.000-08:00</published>
<updated>2007-01-10T17:23:35.767-08:00</updated>
<title type='text'>My first post ever</title>
<content type='html'>Content goes here!</content>
<link rel='alternate' type='text/html'
href='http://www.example.com/myblog/posts/55'></link>
<link rel='self' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/default/55'></link>
<link rel='edit' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/edit/55'></link>
<author><name>tsa</name></author></entry>
<entry>
<id>http://www.example.com/myblog/posts/56</id>
<published>2007-01-11T17:21:00.000-08:00</published>
<updated>2007-01-10T17:23:35.767-08:00</updated>
<title type='text'>My second post ever</title>
<content type='html'>Content for second post goes here!</content>
<link rel='alternate' type='text/html'
href='http://www.example.com/myblog/posts/56'></link>
<link rel='self' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/default/56'></link>
<link rel='edit' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/edit/56'></link>
<author><name>tsa</name></author></entry>
</feed>
|
リスト 1 には、2 つのエントリーのみを持つフィードがあります。このヒントでは、id タグと link タグのみ、そして (リンクの中に含まれる) Atom フィードのソース、つまり URL に焦点を当てます。これは有効な Atom 1.0 フィードですが、id タグの作成に関して潜在的な危険性をはらんでいます。
問題は、URL、つまり link タグの内容が、id として使われている点です。atom:id 要素は、Atom シンジケーション・フォーマットの仕様 (「参考文献」にリンクがあります) に書かれているとおり、絶対に重複が起こらないように作成されている必要があります。
ブログやニュース Web サイト、あるいはどのようなコンテンツを配信するにせよ、その構造から id エントリーの重複が防げるとしても、atom:id 要素の内容として単純に URL を使うのは悪い習慣です。それによって重複が起きる可能性があるからです。
例えば皆さんは、ブログのポストや記事を編集するかもしれません。新しい内容を保存する際には、その URL は同じです。しかし、新しいデータベース・エントリーが作成されています。これはつまり、Atom エントリーは、更新されたエントリーとは別の、固有の id を持つ必要があるということです。
修正は、atom:id 要素を適切にフォーマットすることで行います。id 要素をフォーマットするための最も一般的な方法は、「tag」URI スキームを使う方法です (「参考文献」に完全な仕様へのリンクがあります)。
このスキームは基本的に、重複が不可能なように、しかも atom:id 要素から逆に URL が得られるように atom:id 要素を作成するためのフォーマットです。
リスト 1 に示した 3 つの id 要素は、リスト 2 に示すタグ・スキームに変換されます。
リスト 2. id 要素をタグ・スキームに変換する
<id>tag:example.com,2007:myblog</id>
<id>tag:example.com,2007:myblog.post-55</id>
<id>tag:example.com,2007:myblog.post-56</id>
|
今度はポストを編集しても、URL つまり link 要素は変化しませんが、id は <id>tag:example.com,2007:myblog.post-55.edit-0</id> のように変化するかもしれません。編集後はすべてが無視され、この URL は相変わらずこの id 要素から取得することができます。この atom:id を再変換した URL は、http://www.example.com/myblog/posts/55/edit/0 となります。
これで終わりです。今後は、不適切な構成の atom:id 要素によってフィード・エントリーが重複したり上書きされたりするトラブルを回避できるはずです。
これで、Atom フィードについて、そして atom:id 要素を固有に保つことの重要さを理解できたと思います。そしてもっと重要なこととして、フィードを作成するためのコードを開発する際には、このヒントで説明した概念を念頭に置き、フィード・エントリーの中に絶対に atom:id 要素の重複が起こらないことを確認してください。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Atom duplicates samples | x-tipatom1-dup-source.zip | 2KB | HTTP |
学ぶために
- Atom シンジケーション・フォーマットの atom:id 要素に関する情報を入手してください。
-
「tag」URI (Uniform Resource Identifier) スキームの完全な仕様を入手してください。
- DeWitt Clinton のブログ、On RSS and Atom を読んでください。
-
「Atom 1.0 Syndication Formatの概要」(James Snell 著、developerWorks、2005年8月) を読み、この人気の Web コンテンツ・シンジケーション・フォーマットについて学んでください。
- 3 回シリーズの「Atom 出版プロトコルを知る」(James Snell 著、developerWorks、2006年10月から 12 月) では、Atom API を解説しています。
-
「第 1 回: Atom 出版プロトコルを使って Web リソースを作成し、編集する」は、Atom プロトコルの上位レベルの概要と、その基本的な操作と機能を解説しています。
-
「Part 2: Put the Atom Publishing Protocol (APP) to work」は、現実の世界にデプロイされているいくつかのアプリケーションと対話動作を行うために APP を使う方法を解説しています。
-
「Part 3: Introducing the Apache Abdera project」では、(現在 Apache Software Foundation で開発中の) Abdera と呼ばれる新しいオープンソース・プロジェクトを使った Atom 対応のアプリケーションの実装を解説しています。
-
『RSS and Atom in Action』(Dave Johnson 著、Manning Publications 刊、2006年7月) は、もっと物理的なものが欲しい人のために、ニュース・フィード・フォーマットや出版プロトコルのブログ技術と、こうした構成ブロックを組み合わせるための方法を解説しています。
- XML に基づく、Web コンテンツとメタデータのシンジケーション・フォーマット、Atom 1.0 の仕様を読んでください。
- Atom Working Group の Wiki を訪れ、これまでに知られている Atom 1.0 フィード利用者のリストを見てください。
-
「XML的思索: ニュースの配信やそれ以外にもAtomフォーマットを使う」(Uche Ogbuji 著、developerWorks、2004年5月) では、Web メタデータの交換と相互参照のための XML ベースの標準であり、フォーマットであり、そして API でもある、Atomフォーマットを解説しています。
-
developerWorks の XML ゾーンを利用して XML のすべてを学んでください。
- XML および関連技術において IBM 認証開発者になる方法については、IBM XML certification を参照してください。
- developerWorks の XML ゾーンは XML の技術ライブラリーとして、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM レッドブックなどを用意しています。
-
developerWorks technical events and webcasts で最新情報を入手してください。
製品や技術を入手するために
-
feedvalidator.org を利用して Atom フィード・ジェネレーターを検証してください。
議論するために
-
ディスカッション・フォーラムに参加してください。
-
XML zone discussion forums に参加してください。これらのフォーラムでは XML を中心に議論が行われています。