AbderaでRFC以前のFeedを読むために

はてなのAtomフィードとかがそうなんだけど、namespaceがhttp://purl.org/atom/ns#になってたりするのをどうやってparseするかの方法。

この人たちと同じ悩みです。


いくつか問題点は残しつつだが、とりあえず動き出したので書いておく。

Abderaでは拡張タグにはExtensibleElementというのが用意されていて、それなりに簡単に拡張することができるのだが、今回の場合は標準のnamespaceをhttp://www.w3.org/2005/Atomからhttp://purl.org/atom/ns#に変更したいという感じ。

Abderaはパーサー部分はパッケージもorg.apache.abdera.parserパッケージにまとまっており、core部分との依存関係も少ない。jarも別立てで用意されているので、parser部分をちょっとだけ変更して、新しいparserパッケージを作成した。

手順としては

  • parserパッケージのソースを入手し、パッケージ名を変更。今回は
    • org.apache.abdera.parser.stax.pre_rfcとした。
  • coreパッケージのorg.apache.abdera.util.Constantsインターフェースをコピーしてきて、この部分をhttp://purl.org/atom/ns#に変更する。
  public static final String ATOM_NS = "http://www.w3.org/2005/Atom";
  • 新パッケージ内のConstantsのimport文を全部削除。
  • summaryタグ等、現状ではtypeに"text","html","xhtml"を書くのだけど、はてなでは"text/plain"で返してくるので、それの対処をする。

大体これくらいで適当に動き始めた。あと気になっているところはカテゴリ。
はてなではdc:subjectをentryに複数指定するけど、Atomではcategoriesの下にcategoryを置くし、namespaceがfeedやentryと同じ/違うの差があるので、ここのカテゴリを対処すれば、はてなのフィードが綺麗にパースできるようになる。いまはgetExtensionsとかでやってる。

あとはabdera.propertiesで以下のような記述をしてparserを切り替える。

org.apache.abdera.factory.Factory=org.apache.abdera.parser.stax.pre_rfc.FOMFactory
org.apache.abdera.parser.Parser=org.apache.abdera.parser.stax.pre_rfc.FOMParser