第3回 XML::SimpleであらゆるXML文書を料理する作って学ぶ、今どきのWebサービス(1/2 ページ)

RSSにおけるXML::RSSのように、専用のモジュールがある場合にはそれを使えばよいのですが、そうでない場合は汎用のXMLパーサーモジュールを使ってパースすることになります。今回は、XML::Simpleを使ってあらゆるXML文書を料理できるようにしてみます。

» 2007年02月26日 08時00分 公開
[はてな 伊藤直也,ITmedia]

 前回までで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 #!/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 はてなexist APIをXML::Simpleで料理する

 リスト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'
         }
     }
};

リスト2 Data::DumperのDumper関数を使ってwarning

このページで出てきた専門用語

XMLパーサーモジュール

XMLの構造をパースし、プログラムから扱いやすい形式に変換するモジュール。

XML文書が返ってくるというものです

このように、特定のURLに対してXML文書を返すようなAPIのアーキテクチャはREST APIなどと呼ばれる。


       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.