PHPでRSSを作る

(1/1)
PHP で作る RSS ビューア」では RSS を読むプログラムを作成したが、今回は RSS を生成する方のプログラムを作ってみることにする。(RSS 1.0/1.1 のみ対応)

サンプル・プログラム

サンプル・プログラムの解説:コンテンツの準備

コンテンツ配列 $Contents の構造
1次元目 2次元目 内  容
順序(数字) uri コンテンツURL
title タイトル
description 記事
latest 更新日時(RFC3339形式

0069: //コンテンツ配列
0070: $Contents = array(
0071: 1 => array(
0072:     "uri" => "http://www.pahoo.org/e-soul/webtech/php06/php06-21-01.shtm",
0073:     "title"       => "PHPで2つの文章の類似度を計算する(WebAPI版)",
0074:     "description" => "PHPでYahoo! JAPAN WebAPIやKAKASIを利用し、異なる2つの文章の類似度を計算するプログラムを紹介する。2つの文章がまったく違うテーマを扱っているのかどうかを判定する際に役立つ。",
0075:     "latest"      => "2014-06-22T01:04:02+09:00"
0076:     ),
0077: 2 => array(
0078:     "uri" => "http://www.pahoo.org/athome/vehicle/jreast/img20130323-043352.html",
0079:     "title"       => "JR東日本 183系は直流区間専用車",
0080:     "description" => "183系電車は1972年デビューの特急用車両で、485系に似ているが、こちらは直流区間線用である。1974年に登場した1000番台は非貫通型となり、強力な耐寒・耐雪構造となっており、上越線や中央本線へ導入された。",
0081:     "latest"      => "2014-06-21T23:42:02+09:00"
0082:     ),

RSS を作りたいコンテンツを、あらかじめ配列 $Contents に用意しておく。
配列の構造は上表の通り。

実際に RSS を作成するときには、コンテンツ・データベースから取得するなどすればよい。

サンプル・プログラムの解説

0163: /**
0164:  * RSS 1.0を生成
0165:  * @param array  $contents コンテンツ配列
0166:  * @param string $temp RSSテンプレート
0167:  * @return string XML文字列
0168: */
0169: function makeRSS10($contents$temp) {
0170:     global $NameSpace;       //名前空間
0171:     global $Sites;           //サイト諸元
0172: 
0173:     //テンプレート読み込み
0174:     $xml = simplexml_load_string($temp);
0175: 
0176:     //channel部作成
0177:     $channel = $xml->addChild('channel', NULL$NameSpace['RSS1.0']['xmlns']);
0178:     $channel->addAttribute('rdf:about', $Sites['rss'], $NameSpace['RSS1.0']['rdf']);
0179:     $channel->addChild('title', $Sites['title']);
0180:     $channel->addChild('link', $Sites['domain']);
0181:     $channel->addChild('description', $Sites['description']);
0182:     $channel->addChild('language', 'ja', $NameSpace['RSS1.0']['dc']);
0183:     $channel->addChild('creater', $Sites['creater'], $NameSpace['RSS1.0']['dc']);
0184:     $channel->addChild('rights', $Sites['copyright'], $NameSpace['RSS1.0']['dc']);
0185:     $channel->addChild('date', get_gmdate(time()), $NameSpace['RSS1.0']['dc']);
0186: 
0187:     $items = $channel->addChild('items');
0188:     $items = $items->addChild('Sec', NULL$NameSpace['RSS1.0']['rdf']);
0189: 
0190:     foreach ($contents as $content) {
0191:         $e = $items->addChild('li', NULL$NameSpace['RSS1.0']['rdf']);
0192:         $e = $e->addAttribute('rdf:resource', $content['uri'], $NameSpace['RSS1.0']['rdf']);
0193:     }
0194: 
0195:     //item部作成
0196:     foreach ($contents as $content) {
0197:         $item = $xml->addChild('item', NULL$NameSpace['RSS1.0']['xmlns']);
0198:         $item->addAttribute('rdf:about', $content['uri'], $NameSpace['RSS1.0']['rdf']);
0199:         $item->addChild('title', $content['title']);
0200:         $item->addChild('link', $content['uri']);
0201:         $item->addChild('description', $content['description']);
0202:         $item->addChild('date', $content['latest'], $NameSpace['RSS1.0']['dc']);
0203:     }
0204: 
0205:     return $xml->asXML();
0206: }

ユーザー関数 makeRSS10 は、RSS 1.0 を生成する。
最初に関数  simplexml_load_string  を使い、RSS 1.0 のテンプレートをベースに XML オブジェクトを生成する。

ここで注意するのが、XML の名前空間(name space)を指定する変数 $NameSpace である。
PHP でコロンを含む XML要素名を扱う方法」で紹介したが、コロンを含む XML要素は、コロンの前方が名前空間となっている。メソッド addChild や addAttribute を使って子ノードや属性を追加するときには、名前空間の URL を指定してやる必要がある。

0044: //名前空間(name space)
0045: $NameSpace = array(
0046: 'RSS1.0' => array(
0047:     'xmlns' => 'http://purl.org/rss/1.0/',
0048:     'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
0049:     'dc' => 'http://purl.org/dc/elements/1.1/',
0050:     'lang' => 'ja'
0051:     ),

生成した RSS 1.0 は、asXML メソッドを使って文字列として返す。

同様に RSS 1.1 を生成するユーザー関数 makeRSS11 を用意してある。

参考サイト

(この項おわり)
header