SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】SimpleXMLでRSSを取得する

問題

phpでいろんなところからRSSを取ってきて!

Newspaper_Feed_256x256

答え

RSS2.0なら

$data = array();
$rss = simplexml_load_file('https://www.softel.co.jp/blogs/tech/feed');
foreach ($rss->channel->item as $item) {
	$x = array();
	$x['link'] = (string)$item->link;
	$x['title'] = (string)$item->title;
	$x['description'] = (string)$item->description;
	$x['pubDate'] = (string)$item->pubDate;
	$data[] = $x;
}

//確認
var_dump($data);

$item->title などは SimpleXMLElementオブジェクト。その後の処理で文字列として扱うなら、(string)して文字列にキャストする。

$item->description は、内容が <![CDATA[ ~~ ]]> に入っていたりすると、ぱっと見何も取れていないように見えるが、これも(string)してやると内容が取得できる。


RSS1.0なら

$data = array();
$rss = simplexml_load_file('https://www.softel.co.jp/blogs/tech/feed/rdf');
foreach ($rss->item as $item) {
	$x = array();
	$x['link'] = (string)$item->link;
	$x['title'] = (string)$item->title;
	$x['description'] = (string)$item->description;
	$x['pubDate'] = (string)$item->children('http://purl.org/dc/elements/1.1/')->date;
	$data[] = $x;
}

//確認
var_dump($data);

記事の日付が名前空間付きの要素(dc:date など)になっていると、そのまま取得できない。

dc:date が取りたいときは、RDFの最初に xmlns:dc=”http://purl.org/dc/elements/1.1/” とあるので、$item->children(‘http://purl.org/dc/elements/1.1/’)->date する。


ATOMなら

$data = array();
$rss = simplexml_load_file('https://www.softel.co.jp/blogs/tech/feed/atom');
foreach ($rss->entry as $item) {
	$x = array();
	$x['link'] = (string)$item->link->attributes()->href;
	$x['title'] = (string)$item->title;
	$x['description'] = (string)$item->content;
	$x['pubDate'] = (string)$item->published;
	$data[] = $x;
}

//確認
var_dump($data);

URLがlink要素のhref属性になっているなら、$item->link->attributes()->href;

属性にも名前空間付きのがあるらしいので、そういう場合は、$element->hoge->attributes(‘http://purl.org/syndication/thread/1.0’)->fuga のようにする。


いずれも pubDate として取得した項目は string(31) “Wed, 15 May 2013 00:00:36 +0000” のようになっているので、好きな形式に変えたいときは date(‘Y年m月d日’, strtotime(“Wed, 15 May 2013 00:00:36 +0000”)) する。

関連するメモ

コメント