PHPでAtomフィードを取得し一覧表示する

電網覚書のサムネイル画像

本記事のソースコードの利用によって生じた損害について、当方は一切の責任を負いません。ご自身の判断と責任のもとで参照・ご利用ください。

PHPでAtomフィードを取得し更新情報一覧として表示するコードを書いたのですが、結局「お蔵入り」になってしまいました。 とはいえ、別の機会で実装する機会があるかもしれないので、 未来の自分のために備忘録として残すことにしました。

<ul class="entry-list"><?php
$xml_lab = @simplexml_load_file('https://example.com/atom.xml');
if ($xml_lab) {
$count = 0;
foreach ($xml_lab->entry as $entry) {
if ($count >= 5) break;
$title = (string)$entry->title;
$link = (string)$entry->link->attributes()->href;
echo '<li><a href="' . htmlspecialchars($link) . '" target="_blank">' . htmlspecialchars($title) . '</a></li>';
$count++;
}
}
?></ul>

コードの要点と備忘録

上記のコードを、未来の自分が参照するために、主要なポイントを分解して記録しておきます。

1. フィードURLと読み込み (simplexml_load_file)

PHPの標準関数 simplexml_load_file() を使用しています。 これは、引数に指定したXMLファイル(またはURL)を読み込み、パース(解析)し、オブジェクトとして扱えるように変換してくれるものです。 外部ライブラリの導入が不要で、PHPの標準機能だけで完結するのが最大の利点です。

2. エラー抑制(@)の意図

@simplexml_load_file() のように、関数の前に @(エラー制御演算子)を付けています。 これは、万が一フィードのURLが間違っていたり、相手先サーバーの都合でXMLが取得できなかったりした場合に、PHPのエラー(Warning)が画面にそのまま表示されるのを防ぐためです。 その後の if ($xml_lab) という条件分岐で、$xml_lab に正常にオブジェクトが代入された場合(=読み込み成功時)のみ、後続の処理を実行するようにしています。

3. Atomフィードのループ ($xml_lab->entry)

Atomフィードの規格では、記事(エントリー)は タグで繰り返されます。 SimpleXMLはこれをオブジェクトとして認識するため、$xml_lab->entry のようにアクセスし、foreach で回すことができます。 (※RSS 2.0の場合は タグになるため、もしRSS 2.0に対応させる場合は、$xml_lab->channel->item を見るなど、別途分岐処理が必要になります)

4. リンクURL(href属性)の取得 (attributes()->href)

今回、最も重要な備忘録ポイントです。 RSS 2.0の タグは https://... のようにURLがタグの「中身」にあることが多いですが、Atomフィードの タグは のように「属性」としてURLを持っています。 SimpleXMLでこの属性値を取得するには、 $entry->link->attributes()->href という書き方をする必要があります。 attributes() メソッドで属性のリストにアクセスし、その中の href を指定する、という流れです。これを忘れると、$entry->link だけでは空のオブジェクトが返ってきてしまい、URLが取得できません。

5. 件数制限と安全な出力 ($count, htmlspecialchars)

$count 変数を用意し、ループ内でインクリメント($count++)することで、if ($count >= 5) break; のように表示件数を5件に制限しています。 また、取得したタイトル($title)とリンク($link)は、必ず htmlspecialchars() を通してから echo しています。これは、万が一タイトルに > や < などの記号が含まれていた場合に、HTMLの表示が崩れるのを防ぐ(クロスサイトスクリプティングの脆弱性対策)ための基本的な処理です。

結局このコードはお蔵入りになった

さて、このコードですが、主題に書いた通り、結局これを採用することはなく、お蔵入りになってしまいました。 技術的な理由ではなく、実装予定だったサイトからの動線を持たせることをやめたからです。このため、せっかく書いたPHPコードは出番を失ってしまいました。 とはいえ、サーバーサイドでシンプルにAtomフィードを処理する方法として、このコード自体は(未来の私にとって)有用だと考え、こうして備忘録として残しておくことにしました。

0%