ikbhotelsのブログ -2ページ目

ikbhotelsのブログ

本名では公開しづらい技術ネタを書き綴ります。おそらくは、どこかにエロ系が絡んだせいでしょう。でも内容はガチガチの技術系になるはず。

まずはGoogle App Engine特有の機能を必要としない、単なるJavaプログラムである、RSSパーザの開発から始めました。


RSSには複数のバージョンがあり、互換性がありません(参照:Wikipedia: RSS)。このため、どのバージョンに対応するか検討する必要があります。個人的にはRSS 1.0がいちばん馴染みがあるので、できればRSS 1.0にしたいと思っていました。情報の取得元となる各サービスを調べてみると、AmebloFC2 ブログyaplog!goo ブログlivedoor Blogと、すべてRSS1.0をサポートしているようです。というわけで、とりあえずRSS 1.0を対象とします。


RSSはXMLの一種です。お手軽に、Javaの標準クラスであるjavax.xml.parsers.DocumentBuilderを使って解析してみました。DOM形式のライブラリは、対象文書をいったん全部読み込んで木構造のデータを作ってからアプリケーションの処理が始まるので、特にメモリ使用量の点では最善策ではない可能性があります。そのあたりは、実際に動かして、状況を見てから再考しましょうか。


javax.xml.parsers.DocumentBuilderを使えば楽勝だと思っていたのですが、解析結果にアクセスするとタグが見つからなくて焦りました。これはXML名前空間の問題でした。RSS1.0はタグが複数のモジュールに分かれており、XMLの名前空間を使って定義に取り込みます。javax.xml.parsers.DocumentBuilderで名前空間つきのXMLを扱うためには、DocumentBuilderFactory#setNamespaceAwareで設定しておく必要があるようです。まあどうせ、みんな名前空間には同じ名前をつけているので、まとめてタグ名として扱っても問題なさそうですが。プログラムを組む手間は大して変わらないので、一応ちゃんと実装しておきます。


実装していろいろと試しているうちに、おもしろいことに気づきました。ブログサービスではRSSに広告を入れてくるところがありますが、自作のRSSパーザの出力には広告が入っていないのです。RSS1.0では、まずchannel定義があり、その中にitemsとして見出しが並びます。内容はchannelの外にあるitemで定義します。で、今回扱っているブログサービスを見る限りでは、広告はitemには追加されますがchannelの中のitemsには定義がないのです。私のコードでは両者を対応付けて認識しているため、片方しかない広告は無視されています。まあこの事実が知られるようになると、広告がchannelの中にまで入ってくるのかもしれませんが…。


RSSを取得する際は、一応Last-Modifiedヘッダをチェックして、もしあれば次回のリクエストにIf-Modified-Sinceを付けてみました。あまり期待していなかったのですが、Amebloはこの制御ができていました。やっておいて言うのも変ですが、ちょっとびっくり。