MMC checker と XPath

MMC checker という拡張機能を作っている。
これ自体は MyMiniCity をやってない人には「何が嬉しいの?」な超マイナーな拡張機能で、
もちろん現状では Firefox addons にも登録されていない。(登録しても永遠にサンドボックスかもだが)
ただ、内部的には XPath という、俺的に高度な技を使っているので、
これから XPath をあれこれしたい、という人の参考になれば。
「XPath? 3年前からバリバリだぜぃ」という Piro さん レベルの人は読まなくてもいいです。

まず、MMC checker が何をしているかを簡単に。
MyMiniCity の各都市は、その街のデータを xml ファイルで見ることができる。
わが街 Utoland の場合、xml ファイル はこんな感じだ。


utoland.myminicity.com
Utoland
japan
26
61757
 (中略)




この xml ファイルから必要なデータを抽出・加工して、
拡張に同梱したテンプレファイルを加工後のデータで上書きして表示している。
population とか unemployment はタグではさまれているのでデータの取得は簡単そうだが、
問題は bases の com="6550" とかの数字をどうやって抜き出すか、だった。
これが一番大切な生データなのである。

そこで XPath の出番だ。
XMLHttpRequest でファイルを取得した後、例えば population のデータなら "//population" で、
問題の部分も、例えば ind のデータなら "city/bases/attribute::ind" で取得できる。
実に簡単でしょ?

後は MDC の JavaScript からの XPath 利用入門 とか XPath の使用 とかを参照して
JavaScript をゴリゴリ書けばおしまい。
これに比べれば、新規タブで開いた加工後の文書を前面で表示する、という方が難しかった。
(単に、そのものズバリの例が MDC になかったのでコピペできなかっただけ、というオチだが)

ちなみに、なぜ XPath を使うことになったかと言えば、Google スプレッドシートがきっかけだった。
最初は拡張機能ではなく表計算でやろうとしており、Google スプレッドシートのヘルプを検索したところ、「外部データに対する関数」に importXML("URL","query") 関数がのっていた。
この query が XPath クエリだったのである。

なお、C++ とかなら前出の attribute を比較的簡単に取得できるらしい orz


<2008年11月15日追記>
いらないかもしれないけど、ソースコードを張り忘れてたので追記。XPath 関連の一部のみ。

var xmlDoc = req.responseXML;
var nsResolver = xmlDoc.createNSResolver( xmlDoc.ownerDocument == null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement);
var realNameXml = xmlDoc.evaluate('//name', xmlDoc, nsResolver, XPathResult.STRING_TYPE, null );
realName = realNameXml.stringValue;
var popCountXml = xmlDoc.evaluate('//population', xmlDoc, nsResolver, XPathResult.NUMBER_TYPE, null );
popCount = popCountXml.numberValue;

<追記終わり>

この記事へのコメント

この記事へのトラックバック