このブログで以前に紹介した“『Googleニュース用RSSジェネレータ』と『単眼RSS』を使って労働関連に関る最新ニュースのコンテンツを作る”の続編です。 ニュースの表示方法をもう少しカスタマイズしたくなったので、単眼RSSを使わないやり方で編集する方法を模索しました。以下を紹介します。
[概要]
・googleニュースをPHPのSimpleXML拡張モジュールを使ってXMLオブジェクトに変換、さらにarray型データに変換する
・array型データの中から、Webサイトの表示に必要な項目を取り出して、htmlドキュメントを成形する
1.googleニュースをPHPのSimpleXML拡張モジュールを使ってxmlオブジェクトに変換、さらにarray型データに変換する
SimpleXML拡張モジュールは、php5.0.1以上から対応しているので、最近のレンタルサーバなら殆ど利用できると思います。まず、Googleニュース用RSSジェネレータ<http://g.1o4.jp/news-rss.html>でURIを生成します。そのURIで得たデータをSimpleXMLElement、SimpleXMLIteratorを使ってarray型に変換します。というような操作が、phpマニュアルサイトの「User Contributed Notes」のコーディング例 http://php.net/manual/ja/class.simplexmliterator.phpで紹介されていましたので、参考にしました。
その例の中にあるxml2array()関数を使用した場合。
[PHP コーディング例]
1 2 3 4 |
// 例:uriは労働運動関連ニュースを10件取得する場合 $uri = "https://news.google.com/news?ned=us&ie=UTF-8&oe=UTF-8&q=%E5%8A%B4%E5%83%8D%E3%80%80%E9%9B%87%E7%94%A8&output=atom&num=10&hl=ja"; // この関数は、コーディング例にあるユーザ関数です。詳細は、上記のphpマニュアルサイトのリンク先で確認してください。 $rssAtomArray = xml2array($uri); |
2.array型データの中から、Webサイトの表示に必要な項目を取り出して、htmlドキュメントを成形する
[php コーディング例]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$aWork = array(); // Webサイト表示に必要な項目のみ、取り出して保持しておく領域 $aSortKey = array();// ソート用 // Webサイトの表示に必要な情報だけを取り出す foreach ($rssAtomArray["entry"] as $row){ $jpDate = new DateTime($row["updated"][0]); $jpDate->setTimezone(new DateTimeZone("Asia/Tokyo")); array_push($aWork, array("updated" => $jpDate->format("Y/m/d H:i:s"), "title" => $row["title"], "id"=> $row["id"])); array_push($aSortKey, $jpDate->format("Y/m/d H:i:s")); } array_multisort($aSortKey, SORT_DESC, $aWork); // ニュースは、更新日時の降順でソート。 // html成形 $cHTML = "<table style='font-size:16px;'>"; foreach($aWork as $row) { $cHTML .= "<tr>"; $cHTML .= "<td><span>".$row["updated"]."<br/><a href='".substr($row["id"][0], stripos($row["id"][0],"http"))."' target='_blank'>".$row["title"][0]."</a></span></td>"; $cHTML .= "</tr>"; } $cHTML .= "</table>"; echo $cHTML; // ブラウザに表示 |
[説明]
googleニュースで得たarrayデータの要素(=xmlのタグ)
・"updated" :ニュースの更新日時。atom(RFC3339) 形式の世界標準時だったので日本時間に変換
・"title" :ニュースのタイトル
・"id" :ニュースのリンク先情報
これらの要素は、1.の処理の$rssAtomArrayをprint_r()で出力して、確認しました。
今回は、googleニュースの場合ですが、他のxmlオブジェクトは、違ってくるかもしれません。
後は、Webサイトに合わせて、htmlドキュメントを成形して、表示すればOKです。
余談:
XMLオブジェクトをArray型に変換する方法は、ネットで検索すると、json_decode、json_encodeを利用すると簡単にarray型に変換できる、と出てきます。試してみると、googleニュースで取得したデータは、階層が深いのか?うまく変換できませんでした。今回、紹介したSimpleXML拡張モジュールには、イテレータが用意されているので、それを使えばXMLオブジェクトのハンドリングは容易になりますね。
(結局、phpマニュアルサイトのコーディング例を参考にしちゃうんですが)