読者です 読者をやめる 読者になる 読者になる

ゆーすけべー日記

はてなBlogってどーなの!?

WebService::SimpleとXML::Simpleのあまりシンプルではないやり方

WebService::Simple の紹介記事にて、こういうコメントを頂きました。

tf0054さん :

WebService::Simple、とても便利に使わせて頂いています!

Perlがさほど分かっているわけではないので間違っているかもしれないのですが、中でXML::Simpleするとき、ForceArrayなどオプションが(パーサ差し替えが可能となった時点から?)与えられなくなっているように思うのですが。。

何か別の方法で対処可能なものでしょうか。

お、使って頂いてあざーす!対処の方法ありますよー。 ですが、これ、「Simple」を冠する WebService::Simple と、XML::Simple にあまりふさわしくない 若干複雑なコードになっちゃってます。YouTube の GData API からキーワード検索をして、 マッチしたビデオのリンクを出力する簡単なサンプルを掲載するのでこちらを参考にしてください。 ようは、XML::Simple の OO オブジェクトをオプション付きで作って、 WebService::Simple::Parser::XML::Simple のコンストラクタに渡して新しくパーサーを作り、 それを WebService::Simple の response_parser として指定しています。 って、こうやって書いててもわかりにくいか><

use WebService::Simple;
use WebService::Simple::Parser::XML::Simple;
use XML::Simple;

my $keyword = shift || 'perfume';
my $xs = XML::Simple->new( KeyAttr => [], ForceArray => ['entry'] );
my $service = WebService::Simple->new(
    base_url => "http://gdata.youtube.com/feeds/api/videos",
    param    => { v => 2 },
    response_parser =>
      WebService::Simple::Parser::XML::Simple->new( xs => $xs ),
);

my $res = $service->get( { 'q' => $keyword, } );
my $ref = $res->parse_response();

for my $entry ( @{ $ref->{entry} } ) {
    print $entry->{link}->[0]->{href} . "\n";
}

まぁ、XML::Simple も慣れるまでに KeyAttr オプションを知らずにはまったりするのですが、 この WebService::Simple、もっとシンプルにしたいですなぁ。 Moose/Mouse もだいぶ浸透してきたので、API の互換性をうまく保って、Any::Moose で書き直すってのもありですね。 とりあえず、上記のコードを参考に XML::Simple のオプションを指定してみてください。