Atom - RSS改訂の試み
Atomは、RSSのコンセプトを継承しつつ、シンジケーション/コンテンツ配信を主眼に発展的な新しいフィードのフォーマットを作ろうというプロジェクトで、2005年12月にRFCとなりました。元Echoと呼ばれたこの仕様は、フィードの記述だけでなくAPIなども定めていますが、ここではRSSとの対比でのマークアップのみを説明してみます。
Atomとは何か
RSSはサイトの要約や見出しを配信するフォーマットとして成長してきましたが、ウェブログなどの普及で、コンテンツそのものを配信するニーズが高まっています。また、RSSには異なるバージョンが存在(対立)したり、RDFのXML構文が若干煩雑だったりというややこしさもありました。
そこで、RSSの考え方は継承しつつ、既存の要素はいったん忘れて、新たなフォーマットを構築しようという活動が始まります。コンセプトや仕様構築のディスカッションは、初期にはWikiが用いられ[ATOM WIKI]、その後はメーリングリスト[SYNTXML]も加えて議論を重ねながら進み、2005年12月に[RFC4287]となりました。ウェブログツールなどでは一定のポジションを築きつつありますが、RSSとAtomが併存するという、逆にフォーマットが増えてしまう状況ともなっています。
このプロジェクトはEchoという名前で呼ばれていましたが、ほかのオープンソースプロジェクトに同じ名前があったため、紆余曲折を経てAtomという名前になりました。
Atomの基本的なフィードの例
AtomはRSSと同じくXMLに則ってフィードを記述しますが、RDF/XML構文は用いず、要素の名前も新しいものに改められています。簡単な例を記述してみます。
(例)
<feed xmlns="http://www.w3.org/2005/Atom">
<title>The Web KANZAKI - Japan, music and computer</title>
<subtitle>コントラバスの話やX/HTMLの情報を提供しています</subtitle>
<id>tag:www.kanzaki.com,1995:/info/feed</id>
<link href="http://www.kanzaki.com"/>
<author>
<name>神崎正英</name>
</author>
<updated>2003-07-14T12:24:15+09:00</updated>
<entry
>
<title>コントラバスの話</title>
<link href="http://www.kanzaki.com/bass/"/>
<id>tag:www.kanzaki.com,2003-03-20:/bass/</id>
<published>1995-12-15</published>
<updated>2003-03-20T10:00:00Z</updated>
<category scheme="http://xmlns.com/wordnet/1.6/" term="Music"/>
<summary>コントラバスに関する基礎知識、エッセイなどを集めた
楽しくてためになるセクション</summary>
</entry>
<entry>
...
</entry>
...
</feed>
feed要素、entry要素がそれぞれRSSのchannel要素、item要素に相当する役割で、構文はRDFベースのRSS1.0ではなく、RSS0.91やRSS2.0に似ています。日付や作者を示す要素は、Dublin Coreのようなモジュールではなく、基本要素として定義されています。初期のIETF草案の大きな特徴であったhead
要素は、改訂の段階で削除されました。
link
要素がRSSと違ってhref
(およびオプションでrel
)属性を用いる空要素(XHTMLのように)になっているところがひとつの特徴です。作者を示す
author
要素は、name, email,urluriなどを子要素として持って構造化されます。各entry要素に個別にauthorを示すか、headfeed要素で全体のauthorを示します。title要素及び更新日時を示す
updated
要素は必須です。modified各entry要素には
id
要素が必須です。これは、コンテンツが配信されたり別の場所に掲載されてもオリジナルを保持しなければなりません。コンテンツを改訂しても、おなじidを用いるとされています。ID-09からは、feed
要素にもid
要素が必須となりました。XML名前空間URIは、
http://www.w3.org/2005/Atom
となったようです。
カテゴリー要素
ID-04からは、feed
要素、entry
要素ともにその「カテゴリー」を示すcategory
要素を持つことができるようになっています。
- カテゴリーを示す分類名は
term
属性で記述する(必須) - 必要に応じて、そのスキーム(名前空間)を
scheme
属性でIRIとして示す - また、アプリケーションが人間読者に示すためのラベルを
label
属性で加えることができる(category要素または祖先要素のxml:langに従う)
たとえば、あるウェブログ・エントリーが音楽について書かれていることを示すなら、次のような具合:
(例)
<category
term
="Music"scheme
="http://xmlns.com/wordnet/1.6/"label
="音楽"/>
dc:subject
などで主題を示す時に、それを単語(リテラル)とするのか何らかのURIとするのか常に迷うわけですが、category
要素ではこれをterm
とscheme
に分離することで、必須事項を単純化しつつ意味を明確に識別できるようにしました。scheme
とterm
を連結すれば、RDFのURI参照としてすぐ利用できます。
カテゴリーとしてLCSHやDDCといった図書館の主題体系を使いたければ、scheme
にはDublin Coreのスキーム(http://purl.org/dc/terms/LCSH
など)を持ってくればいいし、dmozのカテゴリを使うこともできます(DCスキームはクラスに相当するので、単純にtermと連結してURI参照というわけには行かないのですが)。
「カテゴリ」というと「分類」という感じでひとつの箱に入れるという使い方が多いと思いますが、ここではもっと緩やかに「キーワード」と同じ捉え方で、feed
要素、entry
要素ともに複数のcategory
要素を持つことができます。
古い情報
Atom 0.3と呼ばれていた時期は、head要素がなく、フィードに関する情報はfeed要素の子要素として記述していました。
(例)
<feed version="0.3" xmlns="http://need/a/namespace"> <title>The Web KANZAKI - Japan, music and computer</title> <tagline>コントラバスの話やX/HTMLの情報を提供しています</tagline> <link rel="alternate" href="http://www.kanzaki.com"/> <modified>2003-07-14</modified> <entry> <title>コントラバスの話</title> <link rel="alternate" href="http://www.kanzaki.com/bass/"/> ... </entry> ... </feed>
2004年7月17日のインターネットドラフト(ID)の第2版(draft-ietf-atompub-format-01)以降は、フィードに関する情報はhead要素に記述するようになっています。また、modified, issuedは同年10月20日のID第4版[ATOM-ID03]でupdated, publishedに変更されました。
XHTMLマーク付けを含むコンテンツ
entry要素内に、コンテンツ配信にとって重要であるXHTMLマーク付けを含む内容を書くためには、content要素を用います。type属性でTEXT,HTML,XHTMLを指定して直接コンテンツを記述する方法と、src属性で外部ページを指定する方法があります。
インラインXMLによる方法
(例)
<entry> <title>コントラバスの研究</title> <link href="http://www.kanzaki.com/bass/bass-lecture.html"/> <summary>パトリック・ズュースキントの『コントラバス』を素材にした コントラバス奏者の生態の研究</summary> <content
type="xhtml"
> <div xmlns="http://www.w3.org/1999/xhtml"> <p> <img src="http://www.kanzaki.com/bass/suskind.gif" /> 「<a href="http://www.kanzaki.com/bass/">コントラバスの話</a>」の冒頭に 引用したのは、小説『香水』で有名なドイツの作家パトリック・ズュースキン トの処女作である『コントラバス』です。... </p> </div> </content> </entry>
type属性
が:
- 'xhtml'であるときは、XHTMLのdiv要素内に使えるタグを直接記述できます(content要素は1つのdiv要素と、その内部に孫要素を持つことができる。content要素内部に接頭辞なしでXHTMLのタグを書くためには、名前空間の再宣言が必要)。
- 'html'であるときは、タグは
の形でエスケープしなければなりません(整形式XMLでなくなる恐れがあるので、HTMLを子孫要素とすることはできない)<
div>
- "text/"で始まるMIMEタイプを指定して、テキストを埋め込むことができます。この場合は、content要素は子要素を持つことはできません。
- それ以外のMIMEタイプを指定して、Base64でエンコードしたバイナリデータを埋め込むことができます。
src属性
を使って外部のコンテンツを指定することができますが、"text/"で始まる、もしくは"+xml"で終わるメディアタイプは、src指定ではなく、直接content要素内に記述しなければなりません。したがって、HTML/XHTMLは埋め込み型です。
RDFとAtom
AtomをRDFとして表現するアイデアもいろいろ議論されています[RDF-ECHO]。たとえば、最初の例(の前半)は、feed要素をrdf:RDF要素に置き換え、必要なところにrdf:parseType="Resource"を加えることで、RDFのグラフが得られるようになります。
IETFの初期ドラフトのようにhead要素を用いていれば、比較的簡単にRDFに変換することも可能でした。
(例)
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://need/a/namespace"> <head> <title>The Web KANZAKI - Japan, music and computer</title> <tagline>コントラバスの話やX/HTMLの情報を提供しています</tagline> <link href="http://www.kanzaki.com"/> <authorrdf:parseType="Resource"
> <name>神崎正英</name> </author> <updated>2003-07-14T12:24:15+09:00</updated> </head> <entry> <title>コントラバスの話</title> <link href="http://www.kanzaki.com/bass/"/> <id>tag:kanzaki.com/bass/</id> <published>1995-12-15</published> <updated>2003-03-20T10:00:00Z</updated> <summary>コントラバスに関する基礎知識、エッセイなどを集めた 楽しくてためになるセクション</summary> </entry> </rdf:RDF
>
Atomの構文からこうしたRDF互換の構文へは、XSLTなどを使って変換可能です。Atom 1.0からRDFに変換するXSLTを試作しているので、試してみてください。
また、Atomを巡る動きについてのメモがいくつかありますので、参考にしてください。
参考資料
- [RFC4287]
- The Atom Syndication Format, ,
- <http://www.ietf.org/rfc/rfc4287>
- [ATOM WIKI]
- Atom Wiki FrontPage, Sam Ruby's Wiki
- <http://www.intertwingly.net/wiki/pie/FrontPage>
- [SYNTXML]
- atom-syntax mailing list
- <http://www.imc.org/atom-syntax/>
- [ATOMPUB]
- Atom Publishing Format and Protocol (atompub) Charter, IETF Working Group
- <http://www.ietf.org/html.charters/atompub-charter.html>
- [SYNTAX]
- Syntax, Sam Ruby's Wiki
- <http://www.intertwingly.net/wiki/pie/Syntax>
- [ATOM-ID10]
- The Atom Syndication Format draft-ietf-atompub-format-10, ,
- <http://atompub.org/2005/07/11/draft-ietf-atompub-format-10.html>
- [ATOM03]
- The Atom Syndication Format 0.3, ,
- <http://www.mnot.net/drafts/draft-nottingham-atom-format-02.txt>
- [CONTENT]
- ContentDiscussion, Sam Ruby's Wiki
- <http://www.intertwingly.net/wiki/pie/ContentDiscussion>
- [RUBY]
- Necho 0.1, , www.intertwingly.net ,
- <http://www.intertwingly.net/blog/1506.html>
- [FECHO]
- Formerly Echo / Finally Atom, ,
- <http://danja.typepad.com/fecho/>
- [BRAY]
- I Like Pie, , ongoing ,
- <http://tbray.org/ongoing/When/200x/2003/06/23/SamsPie>
- [SIX LOG]
- Why We Need Echo, , Six Apart
- <http://www.sixapart.com/log/2003/06/why_we_need_ech.shtml>
- [KELLAN]
- Due Process, , LaughingMeme ,
- <http://laughingmeme.org/archives/000944.html>
- [RDF-ECHO]
- RdfAndEcho, Sam Ruby's Wiki
- <http://www.intertwingly.net/wiki/pie/RdfAndEcho>