RSSを取得しトピックス表示

RSSは、ニュースやブログの最新記事のタイトル、リンク先、概要などをXML書式で受け取れるデータである。この最新記事の情報配信を目的とするデータ(RSS)には、RSS1.0、RSS2.0、Atomなどと呼ばれるフォーマットがいくつか存在する。RSSも、

  • RDF Site Summary
  • Really Simple Syndication
  • Rich Site Summary

のように、頭文字を取ったのか、当てはめたのかよく分からない(^_^)。Wikiに説明されているので、読んで見るのもいいかも。

さ て、最近RSSを読み込んで、タイトルとリンクを取り込む作業があった。PHP5が利用できたので、XMLReaderを利用したのだが、ここでも混乱の 種があった。それは、XMLデータを読み込んで解析するのに、自分で0からプログラミングしなくても「パーサ」と呼ばれるモジュールが利用できるのだが、 このパーサ、SAX(Simple API for XML)とDOM(Document Object Model)があり、SAXのようなストリームベースにおいて、プッシュ方式(イベントハンドラタイプ)とプル方式があるのである。XMLReader は、PHP5.1以降で追加されたプル方式のパーサということである。SAXは、タグ項目を読み込んで順次処理するのに対し、DOMは、読み込んでツリー 構造まで構築してくれるようである。アプリケーションの性格によって、スピードやメモリの点でどちらを利用するか決めることになるのだろう。

参考文献:

  • PHPの薬箱 佐久嶋ひろみ著 株式会社九天社
  • PHP5徹底攻略エキスパート編 廣川類 桑村潤著 ソフトバンクパブリッシング株式会社

(071029)

RSSの解析、情報の取り込み方法

RSS1.0とRSS2.0では、お互い共通しないタグがあったり、タグの名前が異なったりするものがある。また、タグの入れ子構造も異なっている。RSS1.0については、神崎さんのページに分かりやすく説明されている。

RSS1.0、 RSS2.0ともにRSSデータの読み込みは、ざくっと言えば「itemタグの中のtitleタグとlinkタグの情報を取り出す」ことである。最初は、 PHPのXML関係のコマンドを使って取り出そうとしたが、自分でプログラミングはいかにも時代遅れである。いろいろ調べた結果、以下の方法を考えること にした。

  1. CakePHP 1.2にある、XMLクラスを利用する
  2. PEARを利用する
  3. スニペット Web Model/Rss Modelを利用する

1の方法は、トライしてみたがRSS1.0とRSS2.0を共通で処理するうまい方法が見当たらず、諦めた。3についてプログラムにコメントがある通り、RSS2.0以外は対応していない。

以下で、2と3についてのどのようにしたか説明したい。

(071029)

PEARを利用してRSSを読み込む

これ、大変お手軽である。CakePHPでPEARが利用できるようになればOKだからだ。(すなわちここは、CakePHPでのPEARの使い方の説明みたいなもの(^_^;) )。PEARの利用については、tomo-fさんのブログに記事が掲載されている。合わせて、CakePHPユーザーズフォーラムGoogleグループを参考にどうぞ。

PEARについては、利用したいモジュールだけダウンロードして利用すれば良い。今回必要なPEARのモジュールは、XML_RSS、 XML_Parser、PEARである。それぞれ「XML/RSS.php」、「XML/Parser.php」、「PEAR.php」がソースプログラ ムである。PEARのモジュールは、依存関係があるので、利用するモジュールに合わせてダウンロードしておく。

作業の概要は以下の通り。

  1. PEARのモジュールを「vendors/PEAR」以下に保存する
  2. モジュールを読み込めるように、インクルードパスを設定する「pear.ini.php」を準備する

「vendors」は、「app」や「cake」と同列のディレクトリを利用した。サブディレクトリ「vendors/PEAR」と「vendors/PEAR/XML」を用意し、上記の各モジュールをコピーする。

pear.ini.phpは、

<?php
  define('PEAR_PATH', dirname(__FILE__) . DS . 'PEAR');
  set_include_path(PEAR_PATH . PATH_SEPARATOR . get_include_path());
?>

というプログラムを、「vendors」ディレクトリに保存する。

Cakeのアクションは、以下の通り超簡単。

function readrss() {
  vendor("pear.ini");
  require_once("XML/RSS.php");

  $rss = & new XML_RSS("http://www.cakephp.jp/modules/rss/rss.php");
  $rss->parse();

  $this->set('items', $rss->getItems());
}

ビューだって以下の通り。

<ul> 
<?php foreach ($items as $item) : ?>
  <li><?php e($html->link($item['title'], $item['link'])) ?></li>
<?php endforeach; ?>
</ul>

XMLReaderを使って、自分でプログラミングしたのがバカみたいでした(T_T)。

(071029)

090220
最近、vendor()が使えないので require_once で実行してる。-> PEARの利用

スニペットRss/web_modelを利用する

PEARを利用せず、CakePHP関連でRSSを読み込む方法がないか探したところ、キャッチアップさんのホームページ制作日誌を見つけた。Cake用のスニペット「rss.php」と「web_model.php」をダウンロードし、app/modelsディレクトリにコピーすればすぐに使えるので、これも大変お手軽である。CakePHPユーザーズフォーラムのスレッドに詳細があるので、参照するとよい。しかし残念ながら、web_model.phpやrss.phpの元情報へのリンクは切れているようである。

また、web_model.phpが利用できる条件として、 phpのCURL(Client URL Library)が利用できる必要があるとのことである。phpinfoなどで確認をどうぞ。

アクションは次の通り。使用モデルとして予め、「$uses = array(‘Rss’);」と指定しておく。

$uses = array('Rss');

function readrss() {
  $rss = $this->Rss->findAll("http://www.cakephp.jp/modules/rss/rss.php", 5, '+1 hour');
  if (!empty($rss['Error'])) {
    die("Error:{$rss['Error']}");
  }

  $this->set('items', $rss['Items']);
}

ビューも次の通り。

<ul>
<?php foreach ($items as $item) : ?>
  <li><?php e($html->link($item['title']['value'], $item['link']['value'])) ?></li>
<?php endforeach; ?>
</ul>

簡単さでは、PEARを利用する方法と変わらない。どちらの方法を利用するかは、あなた次第。

(071104)

※漢字の文字化け
後日、表示させたら文字が化けてました。RSSデータの先頭行を確認すると「encoding=”EUC-JP”」となってました。XMLデータを利用するときは、文字コードも確認しなければいけないですね。ソースの変更は、宿題にさせてもらいました。(071109)