RSS 1.0の要素と構文

RSS (RDF Site Summary) は、サイトの概要をメタデータとして簡潔に記述するXMLフォーマットです。1999年にRSS 0.9が登場して以来、さまざまな議論や変遷を経てきていますが、本稿ではRSS 1.0RDFXML名前空間に基づき、拡張性と「メタデータ配信」の可能性を持つ)を紹介していきます。

RSS 1.0はサイトの情報を簡便に伝えられるよう、次のような簡単な基本構造を持ちます。

  • rdf:RDF
    • channel
      • title
      • link
      • description
      • items
        • rdf:Seq
          • rdf:li+
    • item+
      • title
      • link
      • description?

上記のリストで、要素型名の後ろに?のあるものはオプション、+のあるものは1回以上の繰り返しを示します(ここではRSS 1.0の最小限の構成要素のみを取り上げています。全要素のリストは、後ほど示します。なお本稿では、デフォルト名前空間がRSS、rdf:はRDFの名前空間接頭辞を示すものとして扱います)。

以下、当サイトが「コントラバスの話」と「ごく簡単なHTMLの説明」という2つのリソースを持つことを示すRSSを記述する例を考えながら、RSSの要素型と構文を簡単に説明していきましょう。

RSSはもともと「チャンネル」情報を提供するために開発されたので、基本情報はchannel要素に記述します。この要素はRDFのDescription要素と同様に主語ノードを表す役割を持ち、rdf:about属性でチャンネルのURI(通常このRSS自身のURI)を示します。channelの内容となる要素は次のものです。これらは、このチャンネルの「プロパティ」に相当します。

channel要素内の要素一覧
要素型名役割出現規則
title チャンネル(サマリー対象)のタイトル。できれば40バイト以内 必須
link RSSでサマリー対象とするサイトのURI。ホームページや新着ページのURIが一般的だが、特定のページやセクションのサマリーをチャンネルとする場合はそのURI 必須
description チャンネル(サマリー対象)の内容、機能、ソースなどの概要説明。できれば500バイト以内 必須
image チャンネルのロゴなどがある場合に記述。イメージのURIをrdf:resource属性で示し、さらに具体的内容をrdf:RDF直下のimage要素に記述する オプション
items channelに続くitem要素で記述するリソースの目次に相当。リソースのURIをrdf:li要素のrdf:resource属性で示し、これらをitem要素と対応させる 必須
textinput チャンネルと共に検索用のフォームなどを送る場合に使う。古いRSSとの互換性のために残されているが、あまり使われない オプション

これらの要素を使って、当サイトのチャンネルを記述してみます。このRSSは、http://www.kanzaki.com/info/rss.rdfでアクセスできるものとします。とりあえずimage要素とtextinput要素は使いません。

[例1]

 <channel rdf:about="http://www.kanzaki.com/info/rss.rdf">
  <title>The Web KANZAKI - Japan, music and computer</title>
  <link>http://www.kanzaki.com</link>
  <description>コントラバスの話やX/HTMLの情報を提供しています</description>
  <items>
   <rdf:Seq>
    <rdf:li rdf:resource="http://www.kanzaki.com/bass/"/>
    <rdf:li rdf:resource="http://www.kanzaki.com/docs/htminfo.html"/>
   </rdf:Seq>
  </items>
 </channel>

items要素はRDFのリストとなるので、rdf:Seqrdf:liといったタグを用いてRDFのコンテナモデルとして表現することに注意してください。この目次に示したリソースについて、次のitem要素で見出しや要約を記述していきます。

channelのitems要素で目次として示したリソース(記事、文書など)それぞれについて、item要素で具体的に内容を説明します。それぞれがリソースを記述するので、rdf:about属性で対象URI(主語)を示します。このURIは、対応する目次項目(rdf:li要素)のrdf:resource属性値(URI)と一致させなければなりません。

item要素内では次の要素を用いてリソースを記述します。これらは、各リソースの「プロパティ」という訳です。

item要素内の要素一覧
要素型名役割出現規則
title リソースのタイトル(ニュースヘッドラインなら見出し)。できれば100バイト以内 必須
link リソースのURI。基本的にはrdf:about属性の値と同じ 必須
description リソースの要約、概要説明など。できれば500バイト以内 オプション

RSS 1.0ではitem要素の数は1つ以上で上限はありませんが、RSS 0.9との互換性を考えるならば、15までにしておくことが推奨されています。文字数に関する推奨も、後方互換性のためです。

これらの制約は近い将来取り除かれる方向で検討されており、あまり気にする必要はありません。ただし、description要素に日記やblog記事の全文を記載すると、コンパクトなサマリーを期待する読者には歓迎されないかも知れないので、description要素は短くとどめ、全文は後述するContentモジュールcontent:encoded要素に記述すると良いでしょう。

[例2]

 <item rdf:about="http://www.kanzaki.com/bass/">
  <title>コントラバスの話</title>
  <link>http://www.kanzaki.com/bass/</link>
  <description>コントラバスに関する基礎知識、エッセイなどを集めた
  楽しくてためになるセクション</description>
 </item>

ここまでで取り上げた要素を組み合わせることで、サイトを紹介するための基本的なRSSを作成できます。必要な名前空間宣言を持つルート要素を加え、全体を構成してみましょう。目次(rdf:li要素)のrdf:resource属性で示したURIが、それぞれのitem要素のrdf:about属性値に対応していることを確認してください。

[例3]

<?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#" 
  xml:lang="ja">

 <channel rdf:about="http://www.kanzaki.com/info/rss.rdf">
  <title>The Web KANZAKI - Japan, music and computer</title>
  <link>http://www.kanzaki.com</link>
  <description>コントラバスの話やX/HTMLの情報を提供しています</description>
  <items>
   <rdf:Seq>
    <rdf:li rdf:resource="http://www.kanzaki.com/bass/"/>
    <rdf:li rdf:resource="http://www.kanzaki.com/docs/htminfo.html"/>
   </rdf:Seq>
  </items>
 </channel>

 <item rdf:about="http://www.kanzaki.com/bass/">
  <title>コントラバスの話</title>
  <link>http://www.kanzaki.com/bass/</link>
  <description>コントラバスに関する基礎知識、エッセイなどを集めた
  楽しくてためになるセクション</description>
 </item>

 <item rdf:about="http://www.kanzaki.com/docs/htminfo.html">
  <title>ごく簡単なHTMLの説明</title>
  <link>http://www.kanzaki.com/docs/htminfo.html</link>
  <description>HTMLは本当は簡単で便利なもの。「30分間HTML入門」から
  XHTMLの解説まで、さまざまなテキストで説明します</description>
 </item>

</rdf:RDF>

以上の簡単な要素を揃えるだけで、チャンネルを公開してサイトの情報を提供することができるようになります。この手軽さが、RSSが幅広く支持されている大きな要因です(RSSの公開などについては、末尾の「RSSの実際の利用」セクション参照)。

構文周辺について細かい話

RSS 1.0の仕様で定められていたり推奨されている細かい点をいくつか取り上げておきます。

文字コード
デフォルトはutf-8とされています。正しく文字コード情報を提供すればどんな符号化方法でも良いはずですが、一部のRSS処理ソフト(のXMLパーサ)は、utf-8でないと正しく働かないことがあるようです。
拡張子
ファイルとして保存する場合の拡張子は、.rdfもしくは.xmlが推奨されており、前者がより望ましいとされています。
MIMEタイプ
現時点ではapplication/xmlとなっていますが、[RFC3023]で示されるXMLのメディアタイプが確定したら、それに従うこととされています。

ここまでで取り上げなかったものも含め、RSS 1.0を構成する要素全体をツリーとして示しておきます。各要素の出現順序もこの通りに定められています。(以下のimage要素、textinput要素はあまり使われません。むしろ日付などの要素を取り込むためのモジュールの方が重要です)。

  • rdf:RDF
    • channel
      • title
      • link
      • description
      • image?
      • items
        • rdf:Seq
          • rdf:li+
      • textinput?
    • image?
      • title
      • url
      • link
    • item+
      • title
      • link
      • description?
    • textinput?
      • title
      • description
      • name
      • link

channel要素内のimage,items,textinput各要素は、channel要素に続く各要素の目次の役割を持ちます。したがって、channel要素内のimage、textinput要素は、対応する要素がchannel要素に続く場合のみ必要です。

image要素はサイトのロゴなどの画像を示すために用います。扱いはitem要素と同様ですが、複数を指定することはできません。具体的には、channel内のimage要素でrdf:resource属性を使って画像の存在を示し、channel要素の次にimage要素を置いてtitle,link,urlの各要素を記述します。

image要素でrdf:about属性を用いるのも、item要素の場合と同様です。title要素は、一般に画像の代替テキストとして扱われます。また、linkは画像をアンカーとしてリンクを設定する場合のリンク先となり、画像自身のURIはurl要素に記述します。

[例4]

 <channel rdf:about="http://www.kanzaki.com/info/rss.rdf">
  ...
  <image rdf:resource="http://www.kanzaki.com/parts/banner.png"/>
  ...
 </channel>

 <image rdf:about="http://www.kanzaki.com/parts/banner.png">
  <title>The Web KANZAKI</title>
  <link>http://www.kanzaki.com</link>
  <url>http://www.kanzaki.com/parts/banner.png</url>
 </image>

チャンネルの最後に、検索などのためのフォームを付け加えることを想定しています。フィールドを一つしか送ることができないため、柔軟性に乏しく、RSS1.0では“RSS0.9との互換性のために残されている”となっています。一般にtitle要素を(チャンネル受信側で生成する)フォームの見出し、description要素をラベル、link要素をaction属性の値として用います。他の要素にないname要素は、テキスト入力データの名前(input要素のname属性)となります。

[例5]

 <channel rdf:about="http://www.kanzaki.com/info/rss.rdf">
  ...
  <textinput rdf:resource="http://www.kanzaki.com/search/"/>
  ...
 </channel>

 <textinput rdf:about="http://www.kanzaki.com/search/">
  <title>Search The Web KANZAKI</title>
  <description>検索文字列を入力してください</description>
  <name>key</name>
  <link>http://www.kanzaki.com/search/</link>
 </textinput>

(このセクションはRDFの細部を説明するので、読み飛ばして先に進んでも構いません)

RSSのRDFモデル

[例3]のXML構文をRDFモデルとして表現すると、channel要素のrdf:about属性で示したリソースを主語として連鎖的に叙述するRDFのグラフを描くことができます。

[図1] サンプルRSSのRDFグラフ
/info/rss.rdfを主語にチャンネルの文があり、同じ主語からの目的語である匿名リソースから2つのitem要素のリソースに矢印が伸びる。それぞれのitem要素リソースは、自身を主語として叙述する矢印をのばす

グラフを見ると明らかなように、このRDF(RSS)が記述するステートメントの主語は、それぞれのrdf:about属性が示すリソースです。「サイトのサマリーを示すメタデータ」なのだから主語(channel要素のrdf:about属性の値)はサイトそのもののURIを用いるべきという気がするかも知れません。しかしRSSは「チャンネル」を記述するものなので(主語リソースはchannelクラスのインスタンス)、RDFとしてはチャンネルすなわちRSS自身が主語になります。

要約対象となるサイトは、主語チャンネルからlinkプロパティによってそのURIを示されていますが、これはただのリテラルであり、RDFとしてリンク先リソースを示すかたちになっていません。古いRSSの書式と整合性を取るためにこうなっているわけですが、やはりサイトもリソースとして示す方が意味が(エージェントなどにとって)明確でRDFとしては望ましい構文だったはずだと言えるでしょう。なお、rdf:aboutとlinkを巡る背景は別文書RSS 1.0のchannel要素のrdf:aboutを参照。

RDFモデルの補足説明

channel要素内で目次としてrdf:resource属性でリソースを示し、同じものをitem要素でまたrdf:about属性として示すのは冗長に感じられるかも知れません。これはRDFの構造化モデルで説明したような、ステートメントの目的語が別のステートメントの主語となる文の一例です。[例3]の構文は、次のようにしてchannel内のitems要素にitem要素の記述を直接埋め込んでも、RDFのモデルとしては等価で、[図1]と同じグラフが得られます。

[例6]

<rdf:RDF xmlns:...>
 <channel>
  ...
  <items>
   <rdf:Seq>
    <rdf:li>
     <item rdf:about="http://kanzaki.com/bass/">
      <title>コントラバスの話</title>
      <link>http://kanzaki.com/bass/</link>
      <description>コントラバスに関する基礎知識...</description>
     </item>
    </rdf:li>
    <rdf:li>
     <item rdf:about="http://kanzaki.com/docs/htminfo.html">
      <title>ごく簡単なHTMLの説明</title>
      <link>http://kanzaki.com/docs/htminfo.html</link>
      <description>HTMLは本当は簡単で便利なもの...</description>
     </item>
    </rdf:li>
   </rdf:Seq>
  </items>
  ...
 </channel>
</rdf:RDF 

[例3]のようにitem要素をchannel要素の外に出すほうが、それぞれのリソースを記述するという意味が(人間がXMLを読み書きする時には)分かりやすいかもしれません。それにその方がRSS 0.9の構文に近いので、互換性のためもあってitem要素がchannel要素の外に出されているのでしょう。[例6]はRDFモデルとしては同等ですが、構文が異なるので、RSSアプリケーションがうまく処理できるとは限りません。もっともchannel要素内にitem要素が含まれるという形は、逆にRSS 0.91のモデルに近いので、そのまま処理できてしまうことも多いと思いますが。

また、item要素内のlink要素はrdf:about属性と重複していて蛇足なのですが、rdf:aboutはこのアイテム(コンテンツ)を識別するためのID、linkはハイパーリンクのURLを示し、理屈の上では異なるURIとなることもあり得ます。とはいえ、通常は両者は同じと考えられるので、やはりRSS 0.9との互換性としての意味合いが大きいのでしょう。

RSSの拡張/応用とモジュール

RSS 1.0はXML名前空間を利用した拡張性を重要な特徴としています。名前空間を宣言してCreative CommonsFOAFといったポピュラーな語彙、あるいは独自の要素型を追加することもできます。より高い相互運用性のために、RSS-DEV Working Groupで拡張語彙の標準「モジュール」を定めています[RSSMOD]

現在一般に利用されるのは、Dublin CoreモジュールとSyndicationモジュールの2つです。RSSを利用するプログラムの多くは、これらのモジュールを理解します。また、blogの人気に伴いContentなどほかのモジュールも広まりつつあるようです。

Dublin Coreモジュール

標準的なメタデータ記述要素として用いられるDublin CoreのDCMESを利用するモジュールです。

使い方は簡単です。ルート要素のタグに名前空間の宣言 xmlns:dc="http://purl.org/dc/elements/1.1/" を加え、DCMESのプロパティを使って作者や更新日付などの情報を記述します。名前空間の接頭辞をdc:とすること、これらは第2レベル(rdf:RDF要素の直接の子供)であるchannel, image, item, textinput各要素の直接の子供として(つまりプロパティ要素として)のみ使用することがモジュールで定義されています。またDCMESの修飾子はいまのところサポートされていません。

このモジュールは、チャンネル自身やそこで記述するリソースの更新日を示すのに特に有益です。ニュースヘッドラインなどの情報は、日時の情報がとても重要なので、それを共通の語彙を用いて明記できるメリットは大きいでしょう。dc:dateの形式はYYYY-MM-DDThh:mmを用います[W3CDTF]

[例7]

<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/"
  xml:lang="ja">
...
 <item rdf:about="http://www.kanzaki.com/docs/htminfo.html">
  <title>ごく簡単なHTMLの説明</title>
  <link>http://www.kanzaki.com/docs/htminfo.html</link>
  <description>HTMLは本当は簡単で便利なもの。「30分間HTML入門」から
  XHTMLの解説まで、さまざまなテキストで説明します</description>
  <dc:date>2001-09-14</dc:date>
 </item>
...

dc:subjectを用いてコンテンツの分野や分類を示すのもよく使われる方法です(SharpeaderやNewsGlueなどいくつかのRSSリーダーでは、Subject/分類として一覧に表示してくれるようです)。また、RSS0.91ではチャンネルのlanguage要素が必須だったので、これに代わるものとしてdc:languageを使うこともあります。

米国製blogツールのテンプレートをそのまま使って、日本語コンテンツなのに言語情報をen-USなどとしないよう注意してください。xml宣言のencodingをutf-8にしたままShift_JISのRSSを送り出している例もよく見かけます。

Syndicationモジュール

シンジケーションとはニュースの記事などを配信(配給)するサービスのことです。ウェブ上でも、ニュースサイトなどが最新のヘッドラインを「チャンネル」という形で配信することがありますが、この手段としてRSSが広く使われています。

「配信」といっても、RSSのようなウェブ上のリソースの場合は、基本的はプッシュ型ではなく利用者が情報をチェックしに行かなければなりません。その際、どんな頻度で情報が更新されているかが分かると都合がよいため、Syndicationモジュールの語彙を用いて更新予定を示します。

名前空間宣言
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
updatePeriod
更新の頻度を示します。値はhourly, daily, weekly, monthly, yearlyのいずれかで、省略時はdailyとみなされます。
updateFrequency
updatePeriodと関連づけ、その期間中に何度更新されるかを示します。たとえば、updatePeriodがdailyでupdateFrequencyが2ならば、1日2回更新するという意味です。省略時は 1 とみなされます。
updateBase
上記の要素から次回更新予定時を計算するための基準を示します。一般には、前回の更新日時をYYYY-MM-DDThh:mmの形式[W3CDTF]で示します。

※2004年1月以前の本文書では、この名前空間URIをhttp://purl.org/rss/modules/syndication/と記述していましたが、誤りでした("/1.0"が抜けていた)のでお詫びして訂正します。

[例8]

<rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xml:lang="ja">
 <channel rdf:about="http://www.kanzaki.com/info/rss.rdf">
  <title>The Web KANZAKI - Japan, music and computer</title>
  <link>http://www.kanzaki.com</link>
  <description>コントラバスの話やX/HTMLの情報を提供しています</description>
  <sy:updatePeriod>daily</sy:updatePeriod>
  <items>
  ...

このように記述してあると、“この「チャンネル」は毎日更新されているので、毎日チェックしてください”ということを意味します。

Contentモジュール

XHTMLによるマーク付けなどを含めた、コンテンツをそのまま配信するためのモジュールです。ウェブログツールのRSSテンプレートに含まれていたりするので、最近見かけるようになってきました。提案当時の構文と、改訂された構文がありますが、新しい方だけを取り上げておきます。

名前空間宣言
xmlns:content="http://purl.org/rss/1.0/modules/content/"
encoded
マークアップ記号を実体参照に置き換えるか、CDATAセクションとして、コンテンツそのものを記述します。

提案当時は複数のフォーマットのコンテンツを使い分けることなどを想定していましたが、実質的に使われているのは改訂仕様のcontent:encoded要素のみです。

[例9]

<rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  ...
 <item rdf:about="http://www.kanzaki.com/bass/bass-lecture.html">
  <title>コントラバスの研究</title>
  <link>http://www.kanzaki.com/bass/bass-lecture.html</link>
  <description>パトリック・ズュースキントの『コントラバス』を素材にした
  コントラバス奏者の生態の研究</description>
  <content:encoded><![CDATA[
<p><img src="http://www.kanzaki.com/bass/suskind.gif" />
「<a href="http://www.kanzaki.com/bass/">コントラバスの話</a>」の冒頭に
引用したのは、小説『香水』で有名なドイツの作家パトリック・ズュースキン
トの処女作である『コントラバス』です。これは、ミュンヘンの国立歌劇場に
つとめるしがないコントラバス弾きが、ソプラノ歌手に恋する思いを切々と語
るモノドラマで、ベースを巡るさまざまなフレーズが登場します。ちょうど手
頃な材料なので、ここに表れる科白をテキストに、コントラバスについて研究
してみましょう。</p>
  ]]></content:encoded>
 </item>

Contentモジュールに対応するビューアで表示すると、次のような具合になります(img要素などを埋め込む場合、パスを絶対URIにしておかないとうまくいきません。xml:base属性を使ってもいいはずですが、必ずしも対応していないようです)。当サイトのRSS Feed Readerは、この要素を折り畳んで表示します(例:音楽雑記帖RSS

(画面例)NetNewsWireで表示するとcontent:encodedの内容は画像やリンクもレンダリングされる

Note: 実際のマークアップなどをそのまま扱う場合、次に述べるセキュリティの配慮が重要です。また、CDATAセクションやエスケープ(&lt;など)を使って、ただのテキストでしかないはずの要素をマークアップを含む(子要素がある)ように扱わせるのは、エラーの温床となる危険性もあり、大きな問題を孕むと指摘されていることも注意してください[WALSH]

そのほかのモジュール

そのほか、RSSでさまざまなメタデータを記述するため、独自のモジュールが定義されることもあります:

  • Trackbackモジュール:ウェブログなどのシステムでよく使われるトラックバックに関するURIを、記事のメタデータとしてRSSのアイテムに記述するための語彙です。このモジュールについては「RSSとトラックバック」で簡単に検討しています。

  • Annotationモジュール:記事が参照したりコメントしたりしている相手のURLを記述するreferenceという語彙を定義しています。このモジュールについては上記「RSSとトラックバック」内の「RSS 1.0のannotationモジュール」でごく簡単に説明しています。

  • Eventモジュール:イベントの開始日時、終了日時、場所などをRSSで配信しようというモジュールです。シンプルで使いやすいものの、構文上若干問題があるので、RDFicalを使う方がよさそう。RDFical(RDFカレンダー)のページで、Eventモジュールも少し取り上げています。

  • Taxonomyモジュール:チャンネルのアイテムを分類する(トピックを示す)ために使います。dc:subjectと似ていますが、taxonomyではキーワードを文字列ではなくURIで示します。メモ帖のRSSのtaxonomyモジュールで、少し取り上げています。

RSSとセキュリティ

RSSのような分散型のアプリケーションでは、セキュリティに対する配慮が欠かせません。RSSの利用方法は、ほとんどの場合読みとりのみだと考えられるので、それほど重大な問題はなさそうですが、RSSを処理してブラウザなどに表示させる場合、ごく一般的なCGIと同等の注意は必要です。

  • 表示要素内にHTMLのタグや特殊文字が含まれている場合の処理。特にscript要素などが勝手に働かないよう、エスケープ処理をする
  • link要素、rdf:about属性値などに、javascript:スキームのような特殊なURIが記述されている場合のチェック

RSS1.0の仕様では、urlおよびlink要素で許されるスキームはhttp:、https:、ftp:(textinput要素ではこれに加えてmailto:)に限るとしていますので、これに合わせたチェックをするのも良いでしょう。javascript:に関しては、Kevin A. Burtonによって仕様書にセキュリティの章を追加する提案が出されています[BURTON]

RSSの実際の利用

RSSは、実際にはどんな具合に利用されているのでしょうか。最近では新しい情報をRSSとして提供するサイトが増えてきており、それを読むための「Feed Reader」プログラムもいくつか提供されています。また、簡単なスクリプトで自分のサイトのRSSを自動生成して公開することも可能です。

RSS提供サイト

RSSを集めて一種のポータルとして提供しているサイトとしては、次のようなものがあります。

  • Bulknews -- Bulknewsで巡回している各サイトのRSS(日)
  • Bulkfeeds: RSS Directory & Search -- Bulkfeeds は RSS を中心とした Feeds のディレクトリサービスです。日本国内で Syndicate されている RSS を検索できます(日)
  • 日本で配布されているRSSファイル -- 精力的にRSSを収集し、埋め込み用スクリプトも配布。頑張れ!
  • My Portal -- (2002-03でサービスを終了したそうですが、関連記事とリンクが残されています)

主要なサイトが公開しているRSSを取り込んで、自分用のディレクトリ(ポータル)をつくるのもいいでしょう。現在提供されているRSSをいくつかあげてみます(RSSそのものはXMLなので、ブラウザで見てもそれほど読みやすくはありません)。現状はRSS 0.9/0.91/1.0が混在しています。

RSS生成ツール

RSSをプログラムで生成したり処理するには、次のようなツールや解説が役立つでしょう。

多くのウェブログツールは、テンプレートを使ってRSS生成の設定ができます。また、更新が頻繁なサイトは自動化しないとRSS生成が面倒になってしまうと思いますが、たまに更新するものについてRSSを提供したり、試しにRSSを自作してみようという場合には、テーブルに必要な要素を記述することでRSSを生成してくれる次のようなツールが便利です。

おまけ:当サイトは、試験的に次のデータをRSSで提供しています(いずれもRSS 1.0形式です)。

これらのRSSはXSLTも指定していますので、対応ブラウザ(IE5など)であれば、当サイトの新しい情報を効率的にご覧いただくのに便利です。

過剰巡回に注意

多くのRSSリーダーは、定期的にフィードをチェックして取得できるようになっていますが、プログラムによってはLast-Modifiedヘッダなどを考慮せずに毎回GETをかけていくものがあるので、利用にあたっては設定に注意してください。こうしたツールで頻繁に巡回すると、相手のサーバーに負担をかけてしまいます(各アイテムのリンク先コンテンツまで毎回全部GETするツールなど、もってのほかです)。

If-Modified-Sinceによる更新確認をきちんとおこなっていると思われるのは、今のところSharpReader、FeedReader、NetNewsWire、Bloglines、FeedDemon、RssBandit、xyzzy-rss-modeなどです。

RDFアイコンについて

RDFアイコンは、RDFによって記述されたリソース(RSS 1.0など)を示すために、Dave Beckettによって提供されているシンボルです。画像に埋め込まれたメタデータをそのまま保持することを条件に、自由に利用できます。お気に召したら、ご自身のサイトにコピーの上ご利用ください。なお、形式をGIFに変換することは認められていません。

RSSの歴史〔補足〕

最初のRSSは、Netscape社が自社のポータルMy Netscapeに「チャンネル」を登録するための手段として1999年3月に開発・公開した、バージョン0.9と呼ばれるものです[NS-RELEASE]。これはもともとRDFベース (つまりRDF Site Summary) で、基本的には見出し一覧を配信するためのものでした[RSS09]。1999年7月には、概要を記述するdescriptionなど、UserLandのScriptingNews規格から10以上の要素型を取り入れたRSS 0.91が登場します[RSS091]。見出しだけでなく要約、格付け、著作権、更新日付などさまざまな情報も加えたサイトサマリーを提供できるところからRich Site Summaryと呼ばれ、何割かのコンテンツプロバイダはこの新しいフォーマットを採用しました。ただしRSS 0.91では、RDFはチャンネル作成者にとって複雑だとして、ルート要素をrssとする独自のXMLに変更されています。

その後Netscape社はRSSから手を引きますが、サイトサマリーを提供する枠組みとしてのRSSへの要望はむしろ高まり、これに独自の要素型を加味して用いるユーザーも出現するなど、混乱の様相を見せてきました。そこで、

  1. 基本的なサマリー提供機能をコアなRSSとして定義し、
  2. より高度な機能は(XML名前空間を利用した)モジュールとして追加できるようにする

という新しい規格が、改めてRDFに基づくものとして開発者のグループ(RSS-DEVワーキンググループ)で検討されました。この成果として2000年12月に提案されたのがRSS 1.0です[RSS10]。RSS 0.9およびRSS 0.91も依然として用いられていますが、本稿ではRSS 1.0をこれから注目すべき規格と位置づけ、紹介しています。

RDFや名前空間が複雑であるとして、RSS 0.91を拡張したRSS 0.92/0.93を提案するコミュニティもあり、その延長として、2002年8月にRSS 2.0なるものが出てきました(これはRSS 1.0の発展形ではなく、RSS 0.91/0.92 etc.にあれこれ付け足しをしたものですが、一部名前空間を使うようになっています)。それならいっそ、古き良き電子メールスタイルのテキストで単純なRSS 3.0をつくったらというブラックユーモアが出たり[SWARTZ]、逆にRSSを乗り越えて新しいフォーマットをつくろうというAtomのような試みも行われています。

RSS 0.9/1.0はヘッドラインなどの「メタデータ」を扱うことに主眼をおいているのに対し、RSS 2.0やEchoは、RSSを「コンテンツ配信」の手段に拡張しようという考え方で、同床異夢的なところがあります。当サイトは、「メタデータ」配信の可能性、標準やほかの規格との親和性、および拡張性という点から、RSS 1.0を推奨します。なお、RSSの歴史と概要についてはAndrew KingのThe Evolution of RSS[KING]MCFCDFまで遡った経緯とRSS 0.91/1.0の論争の背景についてはDan BrickleyのHistorical debt[BRICKLEY]などを参照してください。

〔注意〕サイト要約のフォーマットRSSとメタデータ記述の枠組みRDFを混同しないでください。RSS⊂RDFでもRSS⊃RDFでも、ましてRSS=RDFでもありません。

参照文献

[NS-RELEASE]
, Netscape Opens My Netscape to Millions of Web Publishers, , Company Press Release
<http://home.netscape.com/newsref/pr/newsrelease744.html>
Dan Libby, RDF Site Summary (RSS) 0.9 official DTD, proposed, , Netscape Communications
<http://my.netscape.com/publish/formats/rss-0.9.dtd>
Dan Libby, RSS 0.91 Spec, revision 3, , Netscape Communications
<http://my.netscape.com/publish/formats/rss-spec-0.91.html>
Dan Brickley, et al., RDF Site Summary (RSS) 1.0, , RSS-DEV Working Group
<http://purl.org/rss/1.0/spec>
[KING]
Andrew King, The Evolution of RSS, , Webreference.com
<http://www.webreference.com/authoring/languages/xml/rss/1/>
[BRICKLEY]
Dan Brickley, RSS-Classic, RSS 1.0 and a historical debt, , RSS-DEV mailing list
<http://groups.yahoo.com/group/rss-dev/message/1136>
Dan Brickley, et al., RDF Site Summary 1.0 Modules, , RSS-DEV Working Group
<http://purl.org/rss/1.0/modules/>
[W3CDTF]
Misha Wolf and Charles Wicksteed, Date and Time Formats, , W3C Note
<http://www.w3.org/TR/NOTE-datetime>
[RFC3023]
M. Murata, et al., XML Media Types, , The Internet Society, Standards Track
<http://www.ietf.org/rfc/rfc3023.txt>
[SWARTZ]
Aaron Swartz, The Road to RSS 3.0,
<http://www.aaronsw.com/weblog/000574>
[BURTON]
Kevin A. Burton, Security section proposal for RSS 1.0 spec.,
<http://www.peerfear.org/rss/permalink/1025904432.shtml>
[WALSH]
Norman Walsh, Embedded Markup Considered Harmful,
<http://www.xml.com/pub/a/2003/08/20/embedded.html>
[TBMOD]
Justin Klubnik, Benjamin and Mena Trott, TrackBack Module for RSS 1.0/2.0, , Version 1.0 (Draft)
<http://madskills.com/public/xml/rss/module/trackback/>