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要素は、改訂の段階で削除されました。

カテゴリー要素

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要素ではこれをtermschemeに分離することで、必須事項を単純化しつつ意味を明確に識別できるようにしました。schemetermを連結すれば、RDFのURI参照としてすぐ利用できます。

カテゴリーとしてLCSHDDCといった図書館の主題体系を使いたければ、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'であるときは、タグは&lt;div&gt;の形でエスケープしなければなりません(整形式XMLでなくなる恐れがあるので、HTMLを子孫要素とすることはできない)
  • "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"/>
  <author rdf: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]
M. Nottingham and R. Sayre, eds., 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]
M. Nottingham and R. Sayre, eds., The Atom Syndication Format draft-ietf-atompub-format-10,
<http://atompub.org/2005/07/11/draft-ietf-atompub-format-10.html>
[ATOM03]
APE (Atom/Pie/Echo) Working Group, 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]
Sam Ruby, Necho 0.1, , www.intertwingly.net
<http://www.intertwingly.net/blog/1506.html>
[FECHO]
Danny Ayers, Formerly Echo / Finally Atom,
<http://danja.typepad.com/fecho/>
[BRAY]
Tim 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]
Kellan Elliott-McCrea, Due Process, , LaughingMeme
<http://laughingmeme.org/archives/000944.html>
[RDF-ECHO]
RdfAndEcho, Sam Ruby's Wiki
<http://www.intertwingly.net/wiki/pie/RdfAndEcho>