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関係のコマンドを使って取り出そうとしたが、自分でプログラミングはいかにも時代遅れである。いろいろ調べた結果、以下の方法を考えること にした。
- CakePHP 1.2にある、XMLクラスを利用する
- PEARを利用する
- スニペット 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のモジュールは、依存関係があるので、利用するモジュールに合わせてダウンロードしておく。
作業の概要は以下の通り。
- PEARのモジュールを「vendors/PEAR」以下に保存する
- モジュールを読み込めるように、インクルードパスを設定する「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)

コメントはまだありません。