本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

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

伊藤 直也, ITmedia
Copyright© 2007 ITmedia, Inc. All Rights Reserved.

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

このシリーズの他の記事を見る

日付:  2007年 3月 30日
レベル:  初級
アクティビティー: 3997 ビュー
お気軽にご意見・ご感想をお寄せください: 


連載第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 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スクリプトに埋め込まれたコメントを読むことができます。

参考文献

著者について

Copyright© 2007 ITmedia, Inc. All Rights Reserved.

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, Open source, Linux
ArticleID=247527
ArticleTitle=作って学ぶ、今どきのWebサービス: 第3回 XML::SimpleであらゆるXML文書を料理する
publish-date=03302007
author1-email=DEVWORKS@jp.ibm.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。