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べったりにしたくない話はいつか書きたい。