PHP バージョン 5 にバンドルされている SimpleXML 拡張機能について説明します。これにより、PHP ページで PHP フレンドリーな構文で XML をクエリ、検索、変更、再公開できるようになります。
PHP バージョン 5 では、XML の読み取りと書き込みのための新しいアプリケーション プログラミング インターフェイス (API) である SimpleXML が導入されています。 SimpleXML では、次の式:
$doc->rss->channel->item->title
ドキュメントから要素を選択します。この式は、文書の構造をよく知っていれば簡単に作成できます。ただし、必要な要素がどこに表示されるかが明確でない場合 (Docbooks、HTML、および同様の説明文書など)、SimpleXML は XPath 式を使用してこれらの要素を見つけることができます。
SimpleXML の入門
RSS フィードを HTML に変換するために PHP ページが必要だとします。 RSS は、リンクされたコンテンツを公開するための単純な XML 形式です。ドキュメントのルート要素は rss で、これにはチャンネル要素が含まれます。チャネル要素には、タイトル、言語、URL などのフィードに関するメタデータが含まれています。 item 要素にカプセル化されたさまざまなレポートも含まれています。各アイテムには、URL を含むリンク要素と、プレーン テキストを含むタイトルまたは説明 (通常は両方) があります。名前空間は使用されません。 RSS には確かにそれ以外にも機能がありますが、この記事ではこれで十分です。リスト 1 は典型的な例を示しており、これには 2 つのニュース項目が含まれています。
リスト 1. RSS フィード
<?xml version="1.0"coding="UTF-8"?>
<rss バージョン="0.92">
<チャンネル>
<title>モッカ・ミット・シュラーク</title>
<リンク>http://www.elharo.com/ブログ</リンク>
<言語>英語</言語>
<アイテム>
<title>ペンシルバニア駅: なくなっても忘れられていない</title>
<説明>
ニューヨークの古いペン駅は私が生まれる前に取り壊されました。
これらの写真を見ると、現在のサイトは間違いのような気がします。
機能していますが、実際には一部のオフィスタワーと地下にすぎません。
新しいマディソンスクエアには特に興味も美しさもありません。
</説明>
<リンク>http://www.elharo.com/blog/new-york/2006/07/31/penn-station</link>
</アイテム>
<アイテム>
<title>エリオット ハロルドのパーソナル</title>
<description>一部の人々は、あなたを必要とする非常に不快なスパム フィルターを使用しています。
件名に E37T などのランダムな文字列を入力すると、通過できます。
言うまでもなく、私も他のほとんどの人もわざわざコミュニケーションを取ろうとしません
彼らはスパム問題にひどく過剰反応している。
個人的にはそうしません...</description>
<link>http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/</link>
</アイテム>
</チャンネル>
</rss>
RSS フィードを HTML にフォーマットするための PHP ページを開発してみましょう。リスト 2 は、このページの基本構造を示しています。
リスト 2. PHP コードの静的構造
<?php // XML ドキュメントをロードして解析します ?>
<html xml:lang="ja" lang="ja">
<頭>
<title><?php // タイトルは RSS から読み取られます ?></title>
</head>
<body>
<h1><?php // タイトルは RSS から再度読み込まれます ?></h1>
<?php
// ここに各項目のタイトルと説明を含めるループを置きます
?>
</body>
</html>
XML ドキュメントの解析
最初のステップは、XML ドキュメントを解析して変数に保存することです。必要なのは、URL を simplexml_load_file() 関数に渡す 1 行のコードだけです。
$rss = simplexml_load_file('http://partners.userland.com/nytRss/nytHomepage.xml');
この例では、Userland の New York Times フィード ( http://partners.userland.com/nytRss/nytHomepage.xml ) からページを入力しました。もちろん、別の RSS フィードへの任意の URL も使用できます。
名前は simplexml_load_file() ですが、この関数は実際にはリモート HTTP URL 上の XML ドキュメントを解析することに注意してください。しかし、この関数の奇妙な点はそれだけではありません。ドキュメント オブジェクト モデル (DOM) などの他の API を使用した場合に予想されるように、戻り値 (ここでは $rss 変数に格納されている) はドキュメント全体を指しません。代わりに、ドキュメントのルート要素を指します。ドキュメントのプロローグとエピローグのコンテンツには、SimpleXML からアクセスできません。
フィードのタイトルを検索する
(フィード内の個々のストーリーのタイトルではなく) フィード全体のタイトルは、RSS ルート要素チャネルの title 子にあります。 XML ドキュメントが rss クラスのオブジェクトのシリアル化された形式であり、チャネル フィールド自体にタイトル フィールドがあるかのように、タイトルを見つけるのは簡単です。通常の PHP オブジェクト参照構文を使用して、タイトルを検索するステートメントは次のようになります。
$title = $rss->channel->title;
見つかったら、出力 HTML に追加できます。これは簡単です。$title 変数をエコーするだけです。
<title><?php echo $title ?></title>
この行は、要素全体ではなく、要素の文字列値を出力します。つまり、テキスト内容は記述されますが、タグは含まれません。
<title><?php echo $rss->channel->title ?></title> の
ように、中間変数 $title を完全にスキップすることもできます。
ページではこの値が複数の場所で再利用されるため、明確な意味を持つ変数に格納する方が便利だと思います。
…