RSSをPHPで処理―PHPの便利関数SimpleXML
ブログなどを運営している方はRSSで更新情報を配信しているかと思います。
逆に色々な情報サイトからRSSを受け取り、まとめサイトを作っている方もいるでしょう。
RSSをマークアップするプログラムを書くのは中々に大変です。
PHPやCGIを使用することで、効率よくマークアップできますが、
今回は比較的プログラミングが容易なPHPで、SimpleXMLという関数を使い書いていきます。
PHPはHTMLに埋め込む感じでコンテンツを作成できます。
C言語を扱った人なら、勉強せずとも習得できる程度に簡単です。
またそこそこ高度なコンテンツが作成できるため、個人・企業問わず色々な 場面で使われます。
PHP自体は、ユーザーの呼び出しを受けるとサーバー側で実行されます 。
そしてユーザーのリクエストに応じたHTMLを出力し、 ユーザーに送信します。
大量のリクエストを受けると、サーバーへの負荷が心配されますが、秒間数百アクセス程度では問題ないと思います。
(ただし、SQLなどのDB処理をすると負荷は増加します)
さて、これ以降が本題。
これより下は、多少PHPを扱える人向けの内容となります。
RSS の処理はXMLの処理とほぼ変わりません。
というか、RSS自体がXMLですし。。
PHPにはSimpleXMLというモジュールがPHP5より標準化されています。
SimpleXML関数はその名の通り、XMLをとてもシンプルに処理できます。
ひとまずRSSの前に簡単なXMLを処理してみましょう。
まずは、今回処理するサンプルXMLを用意しましょう。
sample.xml
[xml]
[/xml]
あくまでサンプルですが、こんな感じで用意してみました。
とりあえず、SimpleXMLを使いグワーッっと書くとこんな感じです。
[php]
“;
foreach ($test->company as $company) {
echo “
echo “” . convert($company->name) . ““;
echo “(” . convert($company->url) . “)”;
echo “
“;
}
echo “
“;
?>
[/php]
特に難しい処理はしていません。
変数$xmlに処理したい文書のパスを代入。
simplexml_load_file()関数で、$xmlに代入した文書を読み込みます。
この関数の返り値はXML文書のrootオブジェクトとなります。
実際にはrootオブジェクトは存在せず、それぞれのXMLの階層をオブジェクトとしてみた場合、最初のtestという属性が入るというだけです。
そして、foreach($test->company as $company)。
僕自身、あまり使わない関数ですが、今回のような場合は使えます。
foreach()は配列など、中にあるオブジェクトの数だけループを繰り返します。
この関数を使う目的としては、以下のような利点があるからです。
通常の配列の場合、foreach()を使わなくても、for()やwhile()でループを回せます。
しかし、要素数(要素名)が名前である連想型配列を考えてみましょう。
条件として「中のオブジェクト全てを処理する」かつ「配列の要素数は変動する」とします。
こうすると指定した回数のループでは全て処理できない可能性がでてきます。
そんなときに使えるのがforeach()です。
foreach()は指定したオブジェクト内のすべてのデータの分ループを回します。
なので、foreach()を使うことで、連想型配列などの配列も何も考えずに処理することができます。
今回はXML内の「$test->company」の「company」の数だけループさせるので、
「foreach($test->company as $company)」と記述しましょう。
「$test->company」は階層を意味します。
今回のxmlファイルをリストで書くと、以下のようになります。
- test
- company
- name
- url
大雑把に書くとこんな感じ。
testというオブジェクトがあり、その中にcompanyが存在します。
さらにcompanyの中にはnameとurlという2つのオブジェクトがあるのが分かると思います。
んで、「$test->company」の話。
これは、「testの下のcompany」という意味になります。
同じように、
nameは、test->company->name
urlはtest->company->url
と表すことができますね。
さて、ソースコードから一部抜粋。この部分で気になる所があると思います。
[php]
foreach ($test->company as $company) {
echo “
echo “” . convert($company->name) . ““;
echo “(” . convert($company->url) . “)”;
echo “
“;
}
[/php]
そう、ループ内では、nameやurlが$companyからしか記述されていません。
これは、foreach()では$test->companyを$companyとして扱うためです。
$companyでループを回すと$testからではなく、$companyからの階層でOKになります。
($testから階層を書くとエラーを吐くので注意)
convert()は、ユーザー定義関数です。
このPHPスクリプトの一番上に、
[php]
[/php]
という関数があるのが分かると思います。
このconvert()関数では、返り値として文字コードを変換した文字列を返します。
この場合ではmb_convert_encoding()というのが実質の本体ですね。
書式はmb_convert_encoding(String, “Encode_frome”, “Encode_to”)です。
今回のXMLファイルの文字エンコーディングが、Shif-JISなので、適当な形式に変換するためautoとしています。
これを記述しなかったり、文字エンコーディングを間違えたりすると、文字化けの原因になりますので注意して下さい。
そうやって出力したものを、<ul>と<li>を使いリストにして表示します。
ひと通りの流れはこんな感じです。
さて、実際に出力させた結果はこちら。
XMLの処理はSimpleXMLを使えばとても簡単で、こんな感じですぐ実装できてしまいます。
さて、本題のRSS。
適当にRSSをどこからか拾ってきましょうか。
てことで、ギズモードさんから借りてきました。
[php]
channel->item as $item) {
echo “
echo ‘ こちら。
とりあえず、基本的な表示の表示とリンクのみです。
<li>タグのみしか使っていないので、あまり綺麗ではありません。
こんな感じで楽にRSSの取得からマークアップまで出来ました。
今回はSimpleXMLを使用した単純なXML処理を行いました。
たまたま見つけた関数で、面白かったので紹介してみました。
また何か面白そうなものがあれば紹介したいと思います。
ではではー。
BGM:伝えたいこと/阿部真央