Node.jsでRSSを処理するの何がいいのかなーと色々試していた。その中で一番考えなくて済みそうなのがxml2jsだった。XMLをparseString()に渡すと、コールバックの引数にオブジェクトに変換して渡してくれる。

このウェブサイトのフィードをパースして標準出力に吐くならこんな感じで簡単。

var http = require('http');
var parseXML = require('xml2js').parseString;

http.get('http://hail2u.net/feed', function (res) {
  var chunks = '';

  res.setEncoding = 'UTF-8';

  res.on('data', function (chunk) {
    chunks += chunk;
  });

  res.on('end', function () {
    parseXML(chunks, {
      trim: true,
      explicitArray: false
    }, function (err, data) {
      if (err) {
        throw err;
      }

      data.rss.channel.item.forEach(function (val, index, array) {
        console.log(val.title + ': ' + val.link);
      });
    });
  });
});

parseString()の第二引数でオプションが指定できる。ここで使ったのは前後の空白を取り除くtrimと、とりあえずArrayにしようとするのを必要な時だけに制限するexplicitArray。RSSのように要素の出現の仕方がはっきりとしている場合にはexplicitArrayを指定しておくと、ゴニョゴニョするコードを書くのが楽になる。他にも色々オプションあるけど、RSS周りだと他にはnormalizeTagsくらいしか使うことなさそう。

機能的に足りなさそうなものはあまりなさそう(気になったのはコメント対応くらい)だけど、便利関数としてparseFile()parseURL()とかはちょっと欲しい気がする。


少し前からこれとHandlebars.jsを使ったNode.jsスクリプトでこのウェブサイトのスタティックなページを生成してる。トリガーにはGruntを使ってるけどGruntべったりにしたくないので、Node.jsスクリプトをペチペチ叩くシェルスクリプトでやれみたいな変態Gruntタスクになってる。Gruntべったりにしたくない話はいつか書きたい。