レベル: 初級 伊藤 直也, ITmedia
2007年 3月 30日 RSSにおけるXML::RSSのように、専用のモジュールがある場合にはそれを使えばよいのですが、そうでない場合は汎用のXMLパーサーモジュールを使ってパースすることになります。今回は、XML::Simpleを使ってあらゆるXML文書を料理できるようにしてみます。
連載第2回まででXML::RSSによるRSSの料理方法は分かったとして、ではRSS以外のXML文書を料理する場合にはどうしたらよいのでしょう?RSSにおけるXML::RSSのように、専用のモジュールがある場合にはそれを使えばよいのですが、そうでない場合は汎用のXMLパーサーモジュール*を使ってパースすることになります。
XML文書からPerlのデータ構造を作るXML::Simple
Perlの代表的なXMLパーサーであるXML::Parserを使ってもよいのですが、ちょっとしたXML文書を処理する程度の場合にはちょっと大げさすぎます。そこでお勧めなのが、いかにもPerl的なモジュールであるXML::Simpleです。
XML::Simpleは、指定したXML文書を自動的に解析して、ハッシュやリストのリファレンスで構成されるPerlのデータ構造を作って返す便利なモジュールです。非常に使い勝手の良いモジュールで、覚えておくと何かと重宝すると思います。
XML文書の例―はてなexist API
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文書が返ってきます。それぞれ、
- diary:指定したURLがはてなダイアリーで言及された回数
- antenna:指定したURLがはてなアンテナで追加されているかどうか(bool値)
- bookmark:指定したURLをはてなブックマークでブックマークしている人の数
となります。このデータをXML::Simpleでパースするプログラムを書いてみます。
はてなexist APIをXML::Simpleで料理する
例として、はてなexist APIを用い、Yahoo! JAPANが何人のはてなユーザーからブックマークされているかを調べてみましょう(リスト1)。
リスト1はてなexist APIをXML::Simpleで料理する
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
|
ここで、XML::Simpleが返却したデータ構造がどのようなものなのか分からないといじりようがないと思われた方もいると思います。こんなときは、Perlの汎用的なデータ構造dump用モジュールであるData::Dumperを使います。次のように、
とモジュールをuseでロードして、
my $data = $parser->XMLin($document);
warn Dumper($data);
|
と、Data::DumperのDumper関数を使ってwarningを出します。すると、リスト2のような結果が得られます。この結果に用いられている記号はPerlのシンタックスそのものです。ハッシュリファレンスが入れ子になっているデータ構造が見えますね。
リスト2Data::DumperのDumper関数を使ってwarning
$VAR1 = {
'count' => {
'bookmark' => {
'content' => '177'
},
'antenna' => {
'content' => '1'
},
'diary' => {
'content' => '413'
}
}
};
|
XML::Simpleのオプションでデータ構造の形を変えてみる
ところでリスト1では、ブックマークされている数を取るのに、
$data->{count}->{bookmark}->{content} |
とデータ構造をたどっていますが、よく見ると最後の{content}は冗長ですね。XML::Simpleがハッシュのデータ構造を作る際に、XML文書のtextノードに'content'というキーを自動で付与していますが、実際には、
$data->{count}->{bookmark} |
で数が取れる方がスマートです。XML::Simpleが作るデータ構造は、オプションである程度その結果を制御できますので、それを使いましょう。CPANのドキュメントによると、ContentKeyオプションを使うといいようです。
my $data = $parser->XMLin (
$document,
ContentKey => '-content'
); |
このように、XMLinにオプションを渡します。すると、データ構造はリスト3のような形に変わります。これで、先に示したスマートな方法で値を取り出すことができますね。
リスト3XML::Simpleのオプションでデータ構造の形を変えてみる
$VAR1 = {
'count' => {
'bookmark' => '177',
'antenna' => '1',
'diary' => '413'
}
};
|
XML::Simpleには、ほかにもさまざまなオプションがあります。複雑なXML文書でも、オプションを適切に渡せば思いどおりのデータ構造を作って利用できます。一般的なXMLプログラミング(SAXやDOM、XPathを使ったそれ)よりもはるかに簡単で便利ですね。
まとめ
今回までで、今どきのWebプログラミングの基礎としてPerlにおけるライブラリ群であるCPANの使い方、およびWebアクセスに欠かせないLWPやXMLモジュールの使い方を解説しました。次回以降はこれを発展させて、より実用的なアプリケーションの作り方を解説していきたいと思います。お楽しみに。
このページで出てきた専門用語
-
XMLパーサーモジュール
- XMLの構造をパースし、プログラムから扱いやすい形式に変換するモジュール。
-
XML文書が返ってくるというものです
- このように、特定のURLに対してXML文書を返すようなAPIのアーキテクチャーはRESTAPIなどと呼ばれます。
-
POD
- Perl Old Documentationの略で、Perlの標準ドキュメント記法。プログラム中にコメントを埋め込んだり、簡単なドキュメントを記述する際に使用します。perldocコマンドを使えば、Perlスクリプトに埋め込まれたコメントを読むことができます。
参考文献
著者について  | |  | 伊藤直也,ITmedia |
記事の評価
|