id:omochistがもち - XPathでXPathのコードを書いてるのを見て、似たようなXPathを用いたノードの検索をPerlでやってみた。まぁ、うちも同じ授業うけてるわけなんだけど。
#!/usr/bin/env perl
use warnings;
use strict;
use XML::XPath;
use XML::XPath::XMLParser;
use Encode;
my ($filename, $keyword) = @ARGV;
if (!$filename || !$keyword) {
print STDERR "usage: $0 filename keyword\n";
exit 1;
}
my $xpath = XML::XPath->new(filename => $filename);
my $nodeset
= $xpath->find( decode_utf8(qq{/Products/Item[Name/text()="$keyword"]/Price/text()}) );
foreach my $node ($nodeset->get_nodelist) {
my $price = encode_utf8(XML::XPath::XMLParser::as_string($node));
print "$keywordの価格は$price円です。\n";
}このスクリプトは、
<Products>
<Item>
<Name>プログラミング Perl VOLUME1</Name>
<Price>5300</Price>
<Deadline>2006/10/9</Deadline>
</Item>
</Products>こんな感じのXMLが渡されることを想定している。実行すると、
$ perl search_by_xpath products.xml 'プログラミング Perl VOLUME1' プログラミング Perl VOLUME1の価格は5300円です。
となる。出力がいかにも課題っぽくてアレっすね。この
/Products/Item[Name/text()="$keyword"]/Price/text()
というXPathが、
- Products要素の子の
- 子のName要素のテキストがkeywordであるような、Item要素の子の
- Price要素のテキスト
を指し示してることになる。
と作ってみたものの、まぁ、たいしたこともしていないのでid:omochistのRuby版ともほとんど変わんないなー。
Plaggerでは、EntryFullText等でHTMLをXPathでextractできるようになってたりする。なので、XPathっていう仕組みは、ちょこっとだけ知ってたんだけど、結構複雑な条件付けができたりするものだったのだな。XPathの構文はすこし押さえておきたいとこだ。