一汁三菜

自分が楽しいと思うこと、マラソン、旅行、その他日々の記録をしたい。

XPathとデフォルト名前空間でハマる

以下のようなXML文書に対して、

 <?xml version="1.0" encoding="utf-8" ?>
 <root xmlns="http://example.com/foo">
   <foo>test</foo>
 </root>

次のようにXPathでfoo要素を取り出そうとすると、

var ns = { lookupNamespaceURI : function(prefix) {
  return "http://example.com/foo";
}};
xml.evaluate('/root/foo', xml, ns, XPathResult.FIRST_ORDERED_NODE_TYPE, null);

取り出せない。

デフォルト名前空間を指定しているから大丈夫だろうと思いきや、そうは問屋が卸さず。次のように、prefixをつけてあげたら取り出せた。

var ns = { lookupNamespaceURI : function(prefix) {
  if(prefix == "foo")
    return "http://example.com/foo";
  else
    return "";
}};
xml.evaluate('/foo:root/foo:foo', xml, ns, XPathResult.FIRST_ORDERED_NODE_TYPE, null);

これでだいぶ時間を無駄にしてしまった。