Node.jsパッケージ: xml2js

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