ふゆにどっこい

【perl】TreePPを使って簡単なXML解析

メモメモ

XML::TreePPをとりあえずインストール

perlには「CPAN」というモジュールを使用する事でperlの様々なモジュールをインストールすることができるようです。モジュールモジュールってうるさいすね。

CPANを使用する際は以下のコマンドを実行

perl -MCPAN -e shell

初期設定が完了したら続いてこちらのコマンドを実行。これでTreePPのインストール自体は完了。

install XML::TreePP

早速データを取ってみる。
インストールができないよ!!って人は恐らくperlのバージョンが低い為にCPANでインストールできるモジュールも少ないのでは無いんだと思います。
一度自分のpcに入っているperlのバージョンを確認してみて(ちなみに僕はv5.26.1)

GETメソッドを使用してサイトの情報をXML形式で取得して出力

よくある使用方法だと思う。
このサイトの公開RSSからなんか取ってみます
どっこいしょうのRSS

#!/usr/bin/env perl

use strict;
use warnings;
use XML::TreePP;

my $FEED_URL = 'http://dokkoi-momizi.com/feed/';

main();
sub main {
  my $tp = XML::TreePP->new(user_agent => 'Mozilla/5.0', force_array => ['item']);
  my $result = $tp->parsehttp(GET => $FEED_URL)->{rss}->{channel}->{item};

  foreach my $item (@$result) {
    print join("\n", $item->{title}, $item->{category}, $item->{link}), "\n";
  }
}

上記のプログラムを実行すると以下のような結果が取れるよ

$ perl xml.pl
国立図書館APIとAmazonの画像URLを利用した書籍検索
PHP
ttp://dokkoi-momizi.com/2018/01/20/post-7/

BASIC認証等が必要なサイトにXMLデータをPOST送信して返り値をXMLデータで取得する

無い頭で考えたがこんな方法しか思い浮かばなかった、、もっと簡単なやり方あるなら教えて

#!/usr/bin/env perl

use strict;
use warnings;
use XML::TreePP;

my $URL = 'BASIC認証が必要なURL';

main();
sub main {
  my $tp = XML::TreePP->new(force_array => ['item']);
  my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname -> 0 });
  # BASIC認証時に必要なIDとパスワード
  my $auth_value = 'Basic '.MINE::BASE64::encode("ID:PASS",'');
  my $xml = q{
    送信するXML
  };

  #
  my $tree = $tp->parse(
    $ua->request(POST $URL,
      'Authorization' => $auth_value, 'Content_Type' => 'form_data',
      'Content' => [
        'xml' => $xml,
      ]
    )->as_string;

  foreach my $item (@$result) {
    print join("\n", $item->{title}, $item->{category}, $item->{link}), "\n";
  }
}

おわり🖐