RSS、atomの仕様をまとめる

# この記事の目的

RSS、atomなどコンテンツを配信する仕組みの仕様をまとめ、比較できるようにする。

# 種類

## RSS 1.0

* テキストコンテンツのみしか配信できない

## RSS 2.0

* 配信する文章の色を変えたり、リンクを仕込めるなど、グラフィック面でいろいろ出来る。

## ATOM

* Atom配信フォーマット（Atom Syndication Format）
* Atom出版プロトコル（Atom Publishing Protocol）

ATOMは２つの仕様をもつ。主な仕様は上記の2つ。1つはコンテンツを配信するためのフィードのフォーマットを規定する｢Atom配信フォーマット｣（Atom Syndication Format）、もう1つはウェブ上のコンテンツを編集するための｢Atom出版プロトコル｣（Atom Publishing Protocol）で、通称Atom APIまたはAtomPPとも呼ばれる事がある。

今回はコンテンツの配信なのでAtom配信フォーマット（Atom Syndication Format）についてまとめる。

### 名前空間

Atomフォーマットの要素名や属性名を識別する名前空間として，http://purl.org/atom/ns# を使います．トップレベルの要素feedにデフォルトの名前空間として指定されていますので，feed以下の要素も，指定されていない限りAtomの名前空間に属します．独自の要素を利用して拡張したい場合は，それぞれ別の名前空間を指定して利用します．名前空間で識別すれば，同じ名前の要素も使えるようになります。atomではrssと違い基本的には名前空間が共通化されています。

### コンストラクト

Atomフォーマット全体で幾つかの要素で共通に使われる構成があります．それらをまとめたものをコンストラクトと呼びます．コンストラクトには，Contentコンストラクト，Personコンストラクト，Dateコンストラクト，Linkコンストラクトの四つの種類があります．

#### Contentコンストラクト
　
Contentコンストラクトは，title要素や，summary要素，content要素などキーとなる要素で使われます。ContentコンストラクトにはContentコンストラクトの内容に関するtype属性と、mode属性があります。type属性には，RFC2045で規定されたメディアタイプを指定します．もしこの属性が無かった場合，text/plain として扱われます。mode属性は，「xml」，「escaped」，「base64」の値をとる事が可能です．それぞれ，「xml」は内容がXMLであることを示し，「escaped」はエスケープされている事を示し，「base64」はBase64でエンコードされている事を示します．

#### Personコンストラクト

Personコンストラクトは，著者など人を表す要素で使用されます．name，url，emailの三つの子要素を持ちます．name要素は，人や企業名を表す文字列で，Personコンストラクトには必ず一つだけ存在します．url要素は，人に関係するURIを指定します．例えば，ウェブサイトのアドレスなどがこれにあたります．必須ではありませんが，一つ以上あってはなりません．また，xml:baseが指定されている場合，URIは相対パスである可能性があります．email要素は，人に関連付けられたメールアドレスを指定します．必須ではありませんが，一つ以上あってはなりません．最後に，name，url，emailの要素の出現する順番は特に意味を持ちません．

#### Dateコンストラクト

Dateコンストラクトでは，日付時刻の指定に使われ，そのフォーマットはW3Cで規定された日付時刻フォーマットを用います．最新の仕様では，同じくISO 8601を元にした，より詳細なRFC3339で指定されている日付時刻フォーマットを用いること，と変更されています．

#### Linkコンストラクト

　
Linkコンストラクトは，rel，href，type，titleの四つの属性をもち，子要素を持つことが出来ません．rel属性はRelationship，つまり関係を表し，「alternate」，「start」，「next」，「prev」，「service.edit」，「service.post」，「service.feed」，いずれかの値をとります．「alternate」は，別バージョンのリンクを表します．つまり，ウェブログの記事をAtomフォーマットで記述しているなら，Link要素は，ウェブログの記事へのリンクとなります．「start」，「next」，「prev」は最新のドラフトでは，無くなり新たに「related」という値が加わりました。href属性は，Linkコンストラクトには必須で，値はURIでなければなりません．HTMLのlink要素と同じような役割です．これもまた，xml:baseを適用する必要があります。

type属性は，href属性で指定されたURIのメディアタイプを指定します．あくまでも参考として扱う必要があります。title属性はリンクのタイトルとなり，文字列で表します。Linkコンストラクトは，例えばフィードのLinkは，

```
<link rel="alternate" type="text/html" href="http://blog.example.org/" title=”アトムのウェブログ”/>
```

とフィードと関連付けられたウェブサイトのURLになりますし，個々のエントリに関連付けられたリンクなどでは，

```
<link rel="alternate" type="text/html" href="http://blog.example.org/blog/archives/2004/11/atom.html"/>
```

などのように，個々の記事を指し示すために用いられます。最新のバージョンでは，Linkコンストラクトにhreflang属性が追加されています．これをrel属性の「alternate」指定と共に用いると，翻訳された別言語バージョンを指し示すことが出来ます．hreflang属性の値は，RFC3066で指定された言語コードとなります．

### ATOMのタグ

Atomフォーマットのトップレベルの要素はfeed要素です．feed要素以下の全体を，Atom文書と呼びます．これがフィードとして配信されたり，１ファイルとして保存される単位となります．feed要素には以下の二つの属性が定義されています．

* version：この属性は必須で，値はこのバージョンでは「0.3」となります．
* xml:lang：この属性は必須ではありませんが，推奨となっています．値はRFC3066で定義されている言語コードを指定します．日本語だと「ja」です．

feed要素が持ちうる子要素は以下のものです．

* title：フィードのタイトル。Contentコンストラクトの一つです．必須要素で，必ず一つだけ存在しなければなりません．もしウェブログのタイトルが「鉄腕アトム」なら，この要素のテキストは「鉄腕アトム」となります．この要素にはContentコンストラクトで指定されている，typeとmodeという属性を使う事が出来ます．
* link：linkという要素には一つ特別な種類があります．それは，relという属性をもち，値が「alternate」で固定されています．feed要素には，子要素としてこの種類のlink要素がかならず一つ以上存在していなければなりません．具体的には，<link rel="alternate" type="text/html" href="http://blog.example.org/>のように，フィードが表しているウェブ上のコンテンツ自体を指し示します．さらに，同じtype属性をもつこの種link要素は存在してはなりません．それ以外であれば，feed要素にいくつlink要素があっても構いません．
　
最新の仕様では，rel="alternate"で指定されたリンク先がHTMLのページである場合，そのHTMLページに，autodiscovery linkの仕様を利用したリンクを挿入して，Atomフィードへのリンクを記述することが強く推奨されています．

* author：author要素は人を表すPersonコンストラクトが適用されます．ここでは，フィードのデフォルトの著者を記述します．すべてのエントリにauthor要素が含まれている場合を除いて，ここで必ず一つのauthor要素を記述しなければなりません．
* contributor：フィード貢献した人のPersonコンストラクトが適用されます．複数のcontributor要素を記述可能です．
* tagline：Contentコンストラクトが適用されます．tagline要素は，フィードに関する説明文を記述します．一つかそれ以上のtagline要素を記述することが許可されています．
* id：id要素．恒久的に変わらないフィード用のIDで，古くなったり，フィードが移動した場合でも変わらないグローバルに識別できるIDでなくてはなりません．必須ではありませんが，この要素が存在した場合，値はURIでなければならないとなっています．しかしながら，IDに関しては常に大きな議論となっており，今後も変更される可能性があります．
　
最新のバージョンでは，Identityコンストラクトが新たに設けられ，そこで詳細にIDの条件が規定されています．
* generator：generator要素はフィードを生成したソフトウェア名を入れます．これはデバグやその他の目的で用いられます．この要素には，ソフトウェアに関するURLを記述する「url」とバージョンを文字列で入れる「version」の二つの属性をもつ事が出来きます．
* copyright：copyright要素は，Contentコンストラクトが適用されます．これはフィードの著作権情報を記すためにあります．機械的に処理するライセンス情報を記述するものではありません．
* info：要素は，Contentコンストラクトが適用されます．フィードフォーマット自体に関する説明を記述するためで，特定の状況において配信者側が利用する事が出来るものです．フィードを解析する上では重要な意味を持つものではありません．
* modified：modified要素は，Dateコンストラクトの一つで，エントリも含めて，フィードの最終更新日時を記します．modified要素には，タイムゾーンの指定をし，UTC形式でなければなりません．

## 各言語の例

### RSS 1.0
```XML:RSS1.0
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xml:lang="ja">

    <channel rdf:about="サイトのRSSのURL">
        <title>サイトのタイトル</title>
        <link>サイトのURL</link>
        <description>サイトの内容</description>
        <dc:date>RSSの最終更新日時</dc:date>
        <dc:language>ja</dc:language> 
        <items>
        <rdf:Seq>
        <rdf:li rdf:resource="記事1のURL" />
        <rdf:li rdf:resource="記事2のURL" />
        </rdf:Seq>
        </items>
    </channel>

    <item rdf:about="記事1のURL">
        <title>記事1のタイトル</title>
        <link>記事1のURL</link>
        <description><![CDATA[記事1の内容]]></description>
        <dc:creator>記事1の作者名</dc:creator>
        <dc:date>記事1の作成日時</dc:date>
    </item>

    <item rdf:about="記事2のURL">
        <title>記事2のタイトル</title>
        <link>記事2のURL</link>
        <description><![CDATA[記事2の内容]]></description>
        <dc:creator>記事2の作者名</dc:creator>
        <dc:date>記事2の作成日時</dc:date>
    </item>
</rdf:RDF>
```

### RSS 2.0
```xml:RSS2.0
<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
    <channel>
        <title>PHP & JavaScript：更新情報</title>
        <link>http://phpjavascriptroom.com/</link>
        <description>PHP & JavaScript Room：新着3件</description>
        <item>
            <title>記事タイトル3</title>
            <link>http://phpjavascriptroom.com/post3.html</link>
            <description>記事の内容です。</description>
            <pubDate>Wed, 11 Jun 2008 15:30:59 +0900</pubDate>
        </item>
        <item>
            <title>記事タイトル2</title>
            <link>http://phpjavascriptroom.com/post2.html</link>
            <description>記事の内容です。</description>
            <pubDate>Tue, 10 Jun 2008 15:30:59 +0900</pubDate>
        </item>
        <item>
            <title>記事タイトル1</title>
            <link>http://phpjavascriptroom.com/post1.html</link>
            <description>記事の内容です。</description>
            <pubDate>Mon, 9 Jun 2008 20:50:30 +0900</pubDate>
        </item>
    </channel>
</rss>
```

### Atom
```xml:atom
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='ja'>
    <id>tag:phpjavascriptroom.comfeed/</id>
    <title>PHP & JavaScript Room：更新情報</title>
    <updated>2008-06-11T15:30:59Z</updated>
    <link rel='alternate' type='text/html' href='http://phpjavascriptroom.com/feed/' />
    <link rel='self' type='application/atom+xml' href='http://phpjavascriptroom.com/feed/atom10.xml' />
    <entry>
        <id>http://phpjavascriptroom.com/post3.html#20080611</id>
        <title>記事タイトル3</title>
        <link rel='alternate' type='text/html' href='http://phpjavascriptroom.com/post3.html' />
        <updated>2008-06-11T15:30:59Z</updated>
        <summary>記事の内容です。</summary>
    </entry>
    <entry>
        <id>http://phpjavascriptroom.com/post2.html#200810153059</id>
        <title>記事タイトル2</title>
        <link rel='alternate' type='text/html' href='http://phpjavascriptroom.com/post2.html' />
        <updated>2008-06-10T15:30:59Z</updated>
        <summary>記事の内容です。</summary>
    </entry>
    <entry>
        <id>http://phpjavascriptroom.com/post1.html#20080609205030</id>
        <title>記事タイトル1</title>
        <link rel='alternate' type='text/html' href='http://phpjavascriptroom.com/post1.html' />
        <updated>2008-06-09T20:50:30Z</updated>
        <summary>記事の内容です。</summary>
    </entry>
</feed>
```

これらの元になっているXML言語についてもまとめる

## XML言語

* XMLはタグを自由に決めることができる
* XMLはデータの意味をタグにそれぞれ設定でき、構造化できる
* XMLにはレイアウト・デザインの機能を分離している。

```XML:rei
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="testxsl.xsl"?>
<おこづかい帳>
　<支出>
　　<内容>
　　　<日付>1月20日</日付>
　　　<交通費>780</交通費>
　　　<食費>980</食費>
　　　<嗜好品>250</嗜好品>
　　</内容>
　　<内容>
　　　<日付>1月21日</日付>
　　　<交通費>950</交通費>
　　　<食費>1200</食費>
　　　<嗜好品>300</嗜好品>
　　</内容>
　　<内容>
　　　<日付>1月22日</日付>
　　　<交通費>500</交通費>
　　　<食費>1500</食費>
　　　<嗜好品>250</嗜好品>
　　</内容>
　</支出>
</おこづかい帳>
```

# ATOMができた背景

Atomが生まれた経緯はRSSが古い仕様かつRSS1.0/2.0の仕様策定で色々と揉めていたときにAtomを作ろうという動きになったようです。RSSのバージョンごとに非互換性であったり、仕様が明確になっていなかった事が利用者からの不満が多くありました。今後のRSS仕様の策定は2.0から改変が加えられる様子は無いです。RSSの不満は仕様が曖昧な故に配信者に委ねられるという点です。例えばHTMLのマークアップがコンテンツに含めて良いのか？などの規定がありません。AtomはRSSでの反省を踏まえて、特定のベンダに依存しない、全ての人が自由に実装できる、誰でも自由に拡張可能である、明確にかつ詳細に定義する理念を掲げています。