XML::RSSで複数dc:subjectのRSSを読み込む

2005/07/07 20:00
以下の文章には間違った記述があるため、
訂正:やはりXML::RSSでは複数dc:subjectのRSSを読み込めない?
も参照ください。

はてなブックマークが出力するRSSのdc:subjectにタグ情報が含まれるようになったのでXML::RSSでタグ情報を取得しようとしたら、複数タグが連結した一つの文字列として出力されました。id:naoyaさんの2005年07月05日の最上位のエントリ『nazonoDiary - はてなブックマークAtomAPIで入力が短いと文字化けする』の場合だと、bookmarkatomという文字列が。Bloglinesで同RSSを読み込んでも最後に現れたタグ(dc:subject)しか表示されて無いので、RSSの1itemに対するdc:subjectは一つまで、という仕様なのかと思ってとりあえずXML::Simpleで正確なタグが取得できるようにしました。

RSS Validatorに通してみてもdc:subjectの行ではエラー等が出てないし、以下の仕様を読むと繰り返し定義可能なように見えます(本題とは関係ないけどurlがdel.icio.usっぽい)。

すべての要素は商略可能でありかつ繰り返し可能である。
Dublin Core element(要素)の記述

仕様としても正しそうだし、XML::RSSで正しく読めるはずだなぁと思ってCPANのドキュメントを読んでいると、add_moduleメソッドの説明部分に以下の記述が。

At present, the standard modules Dublin Core (dc) and Syndication (syn) are predefined for your convenience. The Taxonomy (taxo) module is also internally supported.

The modules are stored in the hash %{$obj->{'modules'}} where $obj is a reference to an XML::RSS object.

If you want to automatically add modules that the parser finds in namespaces, set the $XML::RSS::AUTO_ADD variable to a true value. By default the value is false. (N.B. AUTO_ADD only updates the %{$obj->{'modules'}} hash. It does not provide the other benefits of using add_module.)
search.cpan.org: XML::RSS - creates and updates RSS files

ということで$XML::RSS::AUTO_ADD=1とした後にparseすると正しい情報が配列として取得できました。最初からドキュメント読んでおけばなんてことは無い問題ですが、以前も$XML::RSS::AUTO_ADD=1せずにはまってた記憶があるのでメモもかねて書いておきます。

Bloglinesで複数dc:subjectが正しく読めないのは気になります。1itemに対してのsubjectと考えると複数あるのもおかしいと思って当然だし、そう思って僕も最初はXML::Simpleで対処しました。はてなRSSは、僕自身はまだ使ってないのでわかりませんが、他の人が使っているのを見る限りでは、dc:subjectの抽出自体してなさそうですね。
まぁlinkやtitleやdescription要素よりは重要では無いとはいえ、folksonomyとかtaggingとかが一部で流行っている状況をみると、Web2.0な世界では(仕様どおりの?)複数dc:subjectへの対応が必要そうな気がします。