Atomフィードで順序構造を表現する

Qiitaのアドベントカレンダーでは、http://qiita.com/advent-calendar/2015/vim/feed のようにAtom 1.0を利用してフィードを配信しています。今回、利用者からの意見を元に「それぞれの記事がそのアドベントカレンダー内の何日目の記事なのか」という情報をこのフィードに含めてみることにしました。

Atom 1.0の拡張

Atom 1.0の仕様では、title、id、link、summary、updateのような要素が定義されています。しかし、これらの標準的な要素では、今回のような情報、つまり要素間の順序を表す情報を表現することができません。そこで、それを表現できるような拡張的な仕様を新たに見出す必要がありました。

Atomフィードでは、基本的に http://www.w3.org/2005/Atom という名前空間の元で定義された要素を利用しますが、特に明示的に指定されていない限り、任意の位置で任意の要素を記述することができます。しかし、http://www.w3.org/2005/Atom の名前空間内に新たな要素を勝手に追加することは許されません。そのため、今回は別の名前空間内の適当な要素を利用して順序構造を表現するということになります。

Atom Ranking Extensions

幸いにも、これに近い目的を満たすために Atom Ranking Extensions という仕様がIETFで提案されていたため、今回はこの仕様を利用することにしました。詳細は省きますが、以下のように記述することで、あるフィード内でのentry要素の順位を表現できるようです。http://purl.org/atompub/rank/1.0 という名前空間を re という接頭辞で表現し、re:rank という要素でそれを表現しています。

<feed xml:lang="ja-JP" xmlns="http://www.w3.org/2005/Atom" xmlns:re="http://purl.org/atompub/rank/1.0">
  ...
  <entry>
    ...
    <re:rank scheme="tag:qiita.com,2005:/advent-calendar">21</re:rank>
  </entry>
  <entry>
    ...
    <re:rank scheme="tag:qiita.com,2005:/advent-calendar">20</re:rank>
  </entry>
</feed>

反省

Atom Ranking Extensionsは、初期のバージョンでは「Feed Index: Enabling Ordered Entries in Atom」と呼ばれており、要素間の順序を表現するためのものでした。しかし、現在のバージョンではAtom Ranking Extensionsという名前に変わっています。そのため、順序構造というよりは、どちらかと言うと順位を表現するような意味合いが強く、今回の要件は本来のそれとは若干の乖離がある使い方かもしれません。

おわり

AtomやRSSのための名前空間は数多く存在しており、例えば https://validator.w3.org/feed/docs/howto/declare_namespaces.html などを見るとそれらの代表的なものを一覧できます。フィードを配信するとき、もし標準的な要素で表現しきれない情報がある場合は、適当な名前空間を利用することを検討してみてください。