Hatena::ブログ(Diary)

Yet Another Hackadelic

2008-03-04 ぐるるるるるるー、としょっちゅうお腹がうねってる訳です、はい。

XML::LibXML::XPathContextで良くやるミス

自戒の為にメモっとく。

<?xml version="1.0" encoding="utf-8"?>
<doc xmlns:foo="http://foo.com/" xmlns="http://bar.com/">
  <x/>
  <foo:x/>
</doc>

なんてxmlがあるとして、

#!/usr/bin/perl

use strict;
use warnings;

use XML::LibXML;
use XML::LibXML::XPathContext;

my $doc = XML::LibXML->new->parse_file("test.xml");
my $xpc = XML::LibXML::XPathContext->new($doc);

print $xpc->findnodes('//x')->size . "\n";

これは期待に反して「0」と返って来る。

正解はこちら。

#!/usr/bin/perl

use strict;
use warnings;

use XML::LibXML;
use XML::LibXML::XPathContext;

my $doc = XML::LibXML->new->parse_file("test.xml");
my $xpc = XML::LibXML::XPathContext->new($doc);

$xpc->registerNs("bar", "http://bar.com/");

print $xpc->findnodes('//bar:x')->size . "\n";

xmlnsのprefixが空でもXPathContextで空文字で無いprefixを指定しないと動きません。