RSSにおけるXML::RSSのように、専用のモジュールがある場合にはそれを使えばよいのですが、そうでない場合は汎用のXMLパーサーモジュールを使ってパースすることになります。今回は、XML::Simpleを使ってあらゆるXML文書を料理できるようにしてみます。
前回まででXML::RSSによるRSSの料理方法は分かったとして、ではRSS以外のXML文書を料理する場合にはどうしたらよいのでしょう? RSSにおけるXML::RSSのように、専用のモジュールがある場合にはそれを使えばよいのですが、そうでない場合は汎用のXMLパーサーモジュール*を使ってパースすることになります。
Perlの代表的なXMLパーサーであるXML::Parserを使ってもよいのですが、ちょっとしたXML文書を処理する程度の場合にはちょっと大げさすぎます。そこでお勧めなのが、いかにもPerl的なモジュールであるXML::Simpleです。
XML::Simpleは、指定したXML文書を自動的に解析して、ハッシュやリストのリファレンスで構成されるPerlのデータ構造を作って返す便利なモジュールです。非常に使い勝手の良いモジュールで、覚えておくと何かと重宝すると思います。
XML::Simpleでパースする対象として、分かりやすさのためにシンプルなXML文書の例を挙げます。わたしが所属するはてなでは、はてなWebサービスとして、幾つかのWebサービスAPIを公開しています。
その中の1つに「はてなexist API」と呼ばれるAPIがあります。このAPIを用いると、任意のURLに関する幾つかの情報を知ることができます。APIのURLにHTTPのクエリパラメータで任意のURLを指定すると、幾つかの情報が入っているXML文書が返ってくるというものです*。
例えば、Yahoo! JAPAN(http://www.yahoo.co.jp/)に関する情報が知りたいとき、http://d.hatena.ne.jp/exist?mode=xml&url=http://www.yahoo.co.jp/というURLを指定します。すると、
<?xml version="1.0" ?>
<existxml>
<count name="diary">413</count>
<count name="antenna">1</count>
<count name="bookmark">177</count>
</existxml>
というXML文書が返ってきます。それぞれ、
となります。このデータをXML::Simpleでパースするプログラムを書いてみます。
例として、はてなexist APIを用い、Yahoo! JAPANが何人のはてなユーザーからブックマークされているかを調べてみましょう(リスト1)。
1 #!/usr/local/bin/perl
2 use strict;
3 use LWP::Simple;
4 use XML::Simple;
5
6 my $api = 'http://d.hatena.ne.jp/exist?mode=xml&url=';
7 my $url = 'http://www.yahoo.co.jp/';
8
9 my $document = LWP::Simple::get($api.$url)
10 or die "cannot get content from $url";
11
12 my $parser = XML::Simple->new;
13 my $data = $parser->XMLin($document);
14
15 print $data->{count}->{bookmark}->{content}, "\n";
リスト1では、LWP::Simpleでexist APIのURLからYahoo! JAPANに関するXML文書を取得し、XML::SimpleのXMLinメソッドに渡してパースします。これでデータ構造が返ってくるので、その中からデータを取り出しています。
実行すると、次のようにブックマークしているユーザーの数が出力されます。
$ perl parser-sample01.pl
177
ここで、XML::Simpleが返却したデータ構造がどのようなものなのか分からないといじりようがないと思われた方もいると思います。こんなときは、Perlの汎用的なデータ構造dump用モジュールであるData::Dumperを使います。次のように、
use Data::Dumper;
とモジュールをuseでロードして、
my $data = $parser->XMLin($document);
warn Dumper($data);
と、Data::DumperのDumper関数を使ってwarningを出します。すると、リスト2のような結果が得られます。この結果に用いられている記号はPerlのシンタックスそのものです。ハッシュリファレンスが入れ子になっているデータ構造が見えますね。
$VAR1 = {
'count' => {
'bookmark' => {
'content' => '177'
},
'antenna' => {
'content' => '1'
},
'diary' => {
'content' => '413'
}
}
};
XMLの構造をパースし、プログラムから扱いやすい形式に変換するモジュール。
このように、特定のURLに対してXML文書を返すようなAPIのアーキテクチャはREST APIなどと呼ばれる。
Copyright © ITmedia, Inc. All Rights Reserved.