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