RSSは、ニュースやブログの最新記事のタイトル、リンク先、概要などをXML書式で受け取れるデータである。この最新記事の情報配信を目的とするデータ(RSS)には、RSS1.0、RSS2.0、Atomなどと呼ばれるフォーマットがいくつか存在する。RSSも、
のように、頭文字を取ったのか、当てはめたのかよく分からない(^_^)。Wikiに説明されているので、読んで見るのもいいかも。
さ て、最近RSSを読み込んで、タイトルとリンクを取り込む作業があった。PHP5が利用できたので、XMLReaderを利用したのだが、ここでも混乱の 種があった。それは、XMLデータを読み込んで解析するのに、自分で0からプログラミングしなくても「パーサ」と呼ばれるモジュールが利用できるのだが、 このパーサ、SAX(Simple API for XML)とDOM(Document Object Model)があり、SAXのようなストリームベースにおいて、プッシュ方式(イベントハンドラタイプ)とプル方式があるのである。XMLReader は、PHP5.1以降で追加されたプル方式のパーサということである。SAXは、タグ項目を読み込んで順次処理するのに対し、DOMは、読み込んでツリー 構造まで構築してくれるようである。アプリケーションの性格によって、スピードやメモリの点でどちらを利用するか決めることになるのだろう。
参考文献:
(071029)
RSS1.0とRSS2.0では、お互い共通しないタグがあったり、タグの名前が異なったりするものがある。また、タグの入れ子構造も異なっている。RSS1.0については、神崎さんのページに分かりやすく説明されている。
RSS1.0、 RSS2.0ともにRSSデータの読み込みは、ざくっと言えば「itemタグの中のtitleタグとlinkタグの情報を取り出す」ことである。最初は、 PHPのXML関係のコマンドを使って取り出そうとしたが、自分でプログラミングはいかにも時代遅れである。いろいろ調べた結果、以下の方法を考えること にした。
1の方法は、トライしてみたがRSS1.0とRSS2.0を共通で処理するうまい方法が見当たらず、諦めた。3についてプログラムにコメントがある通り、RSS2.0以外は対応していない。
以下で、2と3についてのどのようにしたか説明したい。
(071029)
これ、大変お手軽である。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のモジュールは、依存関係があるので、利用するモジュールに合わせてダウンロードしておく。
作業の概要は以下の通り。
「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の利用
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)