Perl::XPath

XML文書のパースというと昔はDOMしかなかったが、
XPathが速い」、
「いやいや、Staxが速い」
なんか同僚と話す。

とりあえず、XPathを試してみた。

#!/usr/bin/perl
$xmldata = <<EOM;
<list>
   <itempack>
   	<item id="1">Orange</item>
   	<item id="2">Apple</item>
   	<item id="3">Apple</item>
   	<item id="4">Lemon</item>
   </itempack>
</list>
EOM

use XML::XPath;
$xp = XML::XPath->new(xml=>$xmldata);
my ( @nodes ) = $xp->findnodes('/list/itempack');
foreach my $node (@nodes ) {
	my ( @c_nodes ) = $node->findnodes('./item');
	foreach $c_node(@c_nodes){
		if ( $c_node->findvalue('./text()="Lemon"') ) {
			print $c_node->string_value, "\n";
			print $c_node->findvalue('./@id'), "\n";
		}
	}
	print "***\n";
}

ノードアクセスを簡単に書ける。なるほど。