<< コメントフォーム | main | RSSをソート >>

2008.04.05 Saturday

Zend_Feed

RSSのパースにはMagpieRSSを使っているのですが、
せっかくZendFrameworkをインストールしたのだから、
その中に含まれるZend_Feedを使ってみようかな、
ってことでそのメモです。

--

--

まずはリソース。
13.4. RSS フィードの使用
にあるとおり、Zend_Feed_Rssコンストラクタ引数にRSSのURIを指定するだけで、その中のアイテムに簡単にアクセスできることが分かります。

ドキュメントを読み進めていくと、

"getter" 方式の構文 ($obj->property) をした場合は、Zend_Feed はプロパティを XML オブジェクトとして扱います。 一方、メソッドの構文 ($obj->property()) を使用した場合は文字列として扱います。

とあります。 プログラムを作成する上で重要な事項なので、ここはしっかり理解しておきましょう。

また、categoryやdc:subjectの場合、複数要素としても仕様上はOKなので、Zend_Feedでも複数になっていれば配列データとしてアクセスできるようになっています。
(MagpieRSSだと、複数あった場合、単に連結されるだけなので、ちょっと扱いにくかったのを思い出します。)
ただ、マニュアルを見た限りでは取り出し方が書いてないので、少々戸惑います。
そこで、Web検索してみたところ、
Zend_Feedのlink($rel)が上手く動かない
というページを見て氷解。

自分の場合、もうちょっと汎用的にしたかったので、以下のようにしました。

function getArrayData($key)
{
	$data     = "";
	if (is_array($key) and count($key) > 0) {
		$data = array_map(create_function('$e', 'return $e->__toString();'),$key);
	} else {
		$data = $key->__toString();
	}
	return $data;
}
こうしておくと、getArrayData($item->{'category'}); とコールすることで、その中身が単一文字列か配列に格納された文字列として取得できるので、
	$ar = getArrayData($item->{'category'});
	if(is_array($ar)){
		foreach($ar as $ar0){
			print $ar0 . ' ';
		}
	}
	else{
		print $ar;
	}
なんて感じで処理すればよいわけです。
実際にはカテゴリの場合、そのページの絞込み用にリンクを貼ったりします。

これらを踏まえて、全文のサンプルは以下のようになります。
タイトル、概要、カテゴリ、追加データ(dc:dubject)、日付を表示します。
カテゴリ、追加データ、日付に関しては実際に使う場合は、整形したほうが見やすくなると思います。
<?php
require_once 'Zend/Feed.php';
$rss = Zend_Feed::import('フィードのURI');
foreach($rss as $item){
	print $item->title() . "<br>\n";
	print '・概要:' . $item->description() . "<br>\n";
	print '・カテゴリ:';
	$ar = getArrayData($item->{'category'});
	if(is_array($ar)){
		foreach($ar as $ar0){
			print $ar0 . ' ';
		}
	}
	else{
		print $ar;
	}
	print "<br>\n";
	print '・詳細データ:';
	$ar = getArrayData($item->{'dc:subject'});
	if(is_array($ar)){
		foreach($ar as $ar0){
			print $ar0 . ' ';
		}
	}
	else{
		print $ar;
	}
	print "<br>\n";
	print '・日付:' . $item->pubDate() . "<br>\n";
}

function getArrayData($key)
{
	$data     = "";
	if (is_array($key) and count($key) > 0) {
		$data = array_map(create_function('$e', 'return $e->__toString();'),$key);
	} else {
		$data = $key->__toString();
	}
	return $data;
}
?>

テクノラティお気に入りに追加する

Comments

コメント入力は停止しています

海外からと思われるコメントスパムが横行しているため、全記事のコメント入力を停止しています。メッセージのある方は、ホームページの一番下に連絡欄がありますので、そちらからお願いします。

Trackback URL

トラックバックする場合は、
トラックバック元の記事にこのエントリへのリンクを記載してください
このエントリのタイトル「Zend_Feed」
このエントリのリンク「http://kommy.s254.xrea.com/blog/log/eid68.html」