理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

XML::XPath で XPath に入門してみた

XPathXML ドキュメントに対するアドレッシングを行う技術です,みたいなことが W3C に書いてあるんですけど,まぁ今のところは XML のノード(とかノードセットとか)を探したり,ちょっと操作できるようにできるものって理解しているのでした.

今は XPath Syntaxチュートリアルを,XML::XPath を使いながら進めています.

まずはこんなスクリプトを作りました.ヒットしたノード(セット)と,その string_value を表示するだけのものです.

#!/opt/local/bin/perl
use strict;
use warnings;
use XML::XPath;

my $xpath = shift;

my $xml = <<'XMLDOC';
<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>
XMLDOC

my $result = '';
my $xp = XML::XPath->new( xml => $xml );
for my $node ($xp->findnodes( $xpath )->get_nodelist) {
    $result .= $node->getName . ": " . $node->string_value;
}
$result =~ s/^\s*$//gm;
print $result;

まずはテストしよう!

単純なロケーション・パス.

$ ./xpath-syntax.pl /bookstore
bookstore: 

  Harry Potter
  29.99

  Learning XML
  39.95

"最後の book エレメントの値段" とかも指定できるぽいぞ!

$ ./xpath-syntax.pl '//book[last()]/price'
price: 39.95

$35 以上の本のタイトルとかも指定できる!! すごい!!!!!

$ ./xpath-syntax.pl '//book[price>35.00]'
book: 
  Learning XML
  39.95
$ ./xpath-syntax.pl '//book[price>35.00]/title'
title: Learning XML

そういえば,XPath には OR なんて指定もできるみたいですね.

$ ./xpath-syntax.pl '//title | //price'
title: Harry Potter
price: 29.99
title: Learning XML
price: 39.95

次は仕様に目を通す予定.