RSS生成スクリプトのサンプル

RSSの構文は簡単ですが、更新情報などを毎回別途RSSとして記述するのは億劫です。簡単なスクリプトで、RSSを自動生成しましょう。

以下のPerlスクリプトは、更新情報のページが定義型リスト(dl,dt,dd)で記述され、dt要素の中に新着ページへのリンクが記述されているという例を想定しています。ご自身のスタイルに合わせて、適宜書き換えて利用してください。

(例)

$item_title = "dt";     #タイトルとリンクを抜き出す要素
$item_descr = "dd";     #説明文を抜き出す要素
$host = "http://your.domain";

#ソースからタイトル、リンク、説明文を抽出
while(<>){
  if(m|<${item_title}.*?><a href="(.*?)">(.*?)</a>|){
    $link[++$items] = $1;
    $items_list .= qq(    <rdf:li rdf:resource="$host$1"/>\n);
    $title[$items] = $2;
    $isItem = 1;
  }elsif(m|<${item_descr}.*?>(.*?)</${item_descr}>| and $isItem){
    $str = $1;
    $str =~ s/<.*?>//g; #不要なマークアップを削除
    $descr[$items] = $str;
    $isItem = 0;        #説明文は1要素だけにしておく
  }
}

#以下、RSSの構文に従って出力
print <<EOF;
<?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://your/rss/file">
  <title>Your Channel Title</title>
  <link>http://your/home/page</link>
  <description>Your channel description</description>
  <items>
   <rdf:Seq>
$items_list
   </rdf:Seq>
  </items>
 </channel>

EOF

for $i (1..$#link){
  print <<EOF;
 <item rdf:about="$host$link[$i]">
  <title>$title[$i]</title>
  <link>$host$link[$i]</link>
  <description>$descr[$i]</description>
 </item>

EOF
}

print "</rdf:RDF>\n";

タイトル抽出要素をh2にしたり、説明文をp要素から取り出したり、日付を拾い出してdc:date要素で記述するなど、スタイルに応じてさまざまな工夫が可能です(文字コードについては、encodingと異なる場合は適当に変換してください)。

もっとエレガントにというときは、XML::RSSモジュールなどを使うと、後半の出力部分は構文を気にせずにオブジェクト指向風に処理できます。いずれにしても、手軽にRSSが生成できるという点が重要なので、お好みの方法でRSSを作成し、どんどんウェブで公開していってください。

【注意】XMLの基本仕様で定義されている文字参照は、&lt;, &gt; &amp; などごくわずかです。HTML/XHTMLで定義されている文字参照 &auml;, &reg; などを含むテキストをそのままRSSとして出力してしまうと、整形式XMLとならず、XMLパーサを使ったRSS処理ソフトではエラーになるので注意してください(RSSにDOCTYPE宣言を加えて文字参照を定義するか、これらの文字参照を展開した文字に置き換える必要があります)。