日向夏特殊応援部隊

俺様向けメモ

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を指定しないと動きません。