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パッケージのソースを入手し、パッケージ名を変更。今回は
- 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