XML::Feed で XML::RSS::LibXML を使う
はてなRSSではフィードの Auto-Discovery や parse にCPANモジュールのXML::Feedを使っています。XML::Feed は XML::Atom と XML::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 があがっています。ありがとうございます。