XML::Feed で XML::RSS::LibXML を使う

はてなRSSではフィードの Auto-Discovery や parse にCPANモジュールのXML::Feedを使っています。XML::Feed は XML::AtomXML::RSS を抽象化したユニバーサルな parser で、且つ Feed Auto-Discovery の機能も実装されている便利モジュールです。作者は Six Apart の Ben Trott 氏。

これまではてなではあまり積極的に XML 関連モジュールは使ってこなかった(正規表現でぶっこ抜き)のですが、はてなRSS に関しては巡回時にフィードを parse するだけなので、一時的なアクセス増に対する parse 回数の増加などはないだろうと判断して、XML::Feed を採用しています。

もとい、先日ベンチを取ったりしていた XML::RSS::LibXML は動作も安定していそうだし、速度的には XML::RSS よりもかなり速いので是非使いたい。ただ、XML::Feed 内の XML::RSS 抽象化クラスであるところの XML::Feed::RSS では、XML::RSS 以外の parser が使えるようにはなっていない。

ということで、手始めに patch を書いて Six Apart宮川さんに連絡しました。どうやら XML::Feed のメンテもしてくれているっぽかったので。

僕が書いた patch では、XML::RSS::LibXML の有無を eval & use で調べてどちらをロードするか決めるものだったのですが、宮川さんがよりベターなインタフェースとして、

use XML::Feed::RSS;
$XML::Feed::RSS::PREFERRED_PARSER = "XML::RSS::LibXML";

my $feed = XML::Feed->parse(shift);
...

みたいな感じで、package 変数で任意の parser に切り替えられるような patch に変更してくれました。まだこの patch が当たったバージョンは CPAN にあがってないようなのですが、もう間もなくかな?

よし、と思って使い始めてみたところ XML::RSS::LibXML の channel メソッドに XML::RSS との互換性がちょっとだけない箇所があったので、そこを修正して牧さんに patch を送りました。こちらは既に取り込まれており、XML::RSS::LibXML 0.04 があがっています。ありがとうございます。