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]



ソフトバンク株式会社
http://www.softbank.co.jp/


楽天株式会社
http://www.rakuten.co.jp/info/


[/xml]

あくまでサンプルですが、こんな感じで用意してみました。

とりあえず、SimpleXMLを使いグワーッっと書くとこんな感じです。

[php]



XML文書処理



“;
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:伝えたいこと/阿部真央

  • コメントを残す

    Your email address will not be published / Required fields are marked *