JavaScipt - E4Xによるレスポンス処理 を見て、Firefox 1.5 以降では E4X が使えるんだということを思い出したので、Hatena bookmark hack を書き直してみました。
hatenabookmarkhack.user.js (スクリーンショット: ◆F99a.q8oVEの日記 - Hatena bookmark hack - Alternative 全ページをはてなブックマーク化する Greasemonkey Script)
E4X のことはあまり詳しく知らなかったので、次のページを参考にしながら書いてみました。てきとう E4X < 01 < March < 2006 < nulog, NULL::something : out of the headphone
Hatena の API を叩いて返ってきた xml から bookmark 数を取り出す部分はこんな感じ。
var existxml = new XML(res.responseText.replace(/^<\?xml.*?\?>/, ""));
var countofBookmark = existxml.count.(@name == "bookmark");
すげー!E4X を使う以前はこうでした。
var d = (new DOMParser).parseFromString(res.responseText, "application/xml");
var countofBookmark = d.evaluate(
"/existxml/count[@name='bookmark']/text()",
d,
null,
XPathResult.NUMBER_TYPE,
null
).numberValue;
簡潔です。ネームスペースまわりもこれで解決。こんな感じでかけます。
var rssDoc = new XML(xmlString);
var rss = new Namespace("http://purl.org/rss/1.0/");
for each (var item in rssDoc.rss::item.(rss::description != "")) {
hogehoge();
}
今までこんなの書いてたのが嘘のよう。
d.evaluate(
'//*[local-name()="item" and namespace-uri()="http://purl.org/rss/1.0/" and *[local-name()="description" and namespace-uri()="http://purl.org/rss/1.0/" and .!=""]]',
d,
d.createNSResolver(d),
XPathResult.UNORDERED_NODE_ITERATOR_TYPE,
null);
E4X が使えるなら、JSON よりも扱いが簡単かもしれませんね。