<< YWSの画像検索Webサービス | main | バリューコマース・ウェブサービスを使ってみた >>

2007.03.16 Friday

RSS2.0:独自拡張(属性指定)のパース

RSS2.0では、ベンダーが独自拡張できるようになっています。
例えば、
<item><title>タイトル</title><hoge:image xmlns:hoge="http://hoge.com/rss/" class="small" url="http://hoge.com/small.gif" height="70" width="49" /><hoge:image xmlns:hoge="http://hoge.com/rss/" class="large" url="http://hoge.com/large.gif" height="100" width="69" /></item>

と、こんな感じで、一つのアイテムの中に
small,largeの情報を持てたりするわけです。
ただ、独自拡張なだけに、パースするには、それなりの労力が必要。

ということで、簡単にメモ。
--
クラス(属性?という呼び方が正しいのか?よく分からん)指定を考えなければ、PearのXML_Feed_Parserを使えばパース出来るのですが、クラス指定を考えると、そのままでは、全情報をパース出来ません。
(少なくとも、自分が試した限りは)
単に、hoge:priceなど、
クラス指定のないRSSファイルだと、OKなところまでは、確認しましたが、これでは、情報が不足してしまうので、別の方法が必要になります。

そこで、DOM 関数を使って、自力でパースするしかないか、ということで、調べた結果が以下の方法。
基本的には、各サイトのサンプルソースの混ぜ合わせです。

まずは、サブルーチン
function showNode ($node) {
$array = array();

//ノードの名前を表示する
$nodeName = $node->nodeName;
$nodeValue = $node->nodeValue;
$array[$nodeName] = $nodeValue;

//要素ノードの場合
if ($node->nodeType == XML_ELEMENT_NODE) {
//要素が持つすべての属性の集合を取得する
$map=$node->attributes;
//すべての属性の表示
for ($i = 0; $i<$map->length ; $i++) {
$attr = $map->item($i);//属性ノードを取得
$attrName = $attr->name;
$attrValue = $attr->value;
$array[$nodeName][$attrName] = $attrValue;
}
}
return( $array );
}

この関数を呼ぶと、指定されたノードの情報を格納した配列を呼び出し元に返します。

呼び方は、
$dom = new DomDocument;
$dom->load($rss_fname);
$xpath = new domXPath($dom);
$nodelist = $xpath->query('//channel/item');
foreach($nodelist as $node) {
for($child = $node->firstChild ; $child != null ; $child = $child->nextSibling){
//子ノードの情報を表示する
$array = showNode($child);
var_dump($array);
}
print "<hr>";
}

タイトルを取得したければ、$array['title']
概要を取得したければ、$array['description']
クラス指定付きの情報を取得したければ、
$array['hoge:image']['class']でクラスを確認後、
$array['hoge:image']['url']や$array['hoge:image']['width']
なんて感じで必要な情報を取得できます。

最近は、ウェブサービスでもRSS2.0で結果を返してくるところもあるので、こういったやり方をおさえておく必要もあります。

参考にしたサイト:
J.X.Study「第4回 DOM ツリーを巡回する
My RSS 管理人 ブログ++「PHP一行で書けるRSSリーダー
PHP「DOM 関数

--

テクノラティお気に入りに追加する

Comments

コメント入力は停止しています

海外からと思われるコメントスパムが横行しているため、全記事のコメント入力を停止しています。メッセージのある方は、ホームページの一番下に連絡欄がありますので、そちらからお願いします。

Trackback URL

トラックバックする場合は、
トラックバック元の記事にこのエントリへのリンクを記載してください
このエントリのタイトル「RSS2.0:独自拡張(属性指定)のパース」
このエントリのリンク「http://kommy.s254.xrea.com/blog/log/eid24.html」