XML::Simple を使って XML を読む

概要

  • Amazon Web Services の BrowseNodeSearch の結果をXML::Simpleを使って解析し、子ノードを探索する。
  • 親ノード/子ノードの表示だけ行いファイル保存はしないようにした。(2009/12/05)
  • AssociateTagを指定するようにした。(2011/10/27)
  • Web版

BrowseNodeSearch

  • 下記URLにリクエストすることで、あるBrowseNodeの子ノード一覧を取得できる。
    • XXXXは調べたいBrowseNode。
      http://webservices.amazon.co.jp/onca/xml
        ?Service=AWSECommerceService
        &Operation=BrowseNodeLookup
        &ResponseGroup=BrowseNodeInfo
        &AssociateTag=xxxx-22
        &BrowseNodeId=XXXX

スクリプト

  • fileBrowseNodes2.zip
    すべてを展開すべてを収束
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    -
    |
    -
    |
    !
    |
    !
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    -
    |
    |
    |
    |
    |
    |
    -
    |
    !
    |
    |
    -
    |
    |
    |
    |
    -
    |
    |
    !
    !
    -
    |
    !
     
     
     
     
    -
    |
    !
     
     
    -
    |
    -
    -
    |
    |
    |
    !
    !
    !
     
     
    
    #!/usr/local/bin/perl
    #
    # BrowseNodes2.pl
    # Amazon Web Services BrowseNodes 探索スクリプト
    # by TakeAsh
    #
    # http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/BrowseNodeIDs.html
    #
    # 2009.12.05	v2.00	親ノード/子ノードの表示だけ行いファイル保存はしないようにした。
    # 2011.10.27	v2.01	AssociateTagを指定するようにした。
     
    use strict;
    use warnings;
    use utf8;
    use Encode;
    use URI::Amazon::APA;
    use LWP::UserAgent;
    use XML::Simple;
    use YAML::Syck;
     
    $YAML::Syck::ImplicitUnicode = 1;
     
    my $charsetConsole    = 'CP932';
    #my $charsetInFile	= 'UTF-8';
    #my $charsetOutFile	= 'UTF-8';
     
    binmode( STDIN,  ":encoding($charsetConsole)" );
    binmode( STDOUT, ":encoding($charsetConsole)" );
    binmode( STDERR, ":encoding($charsetConsole)" );
     
    my $confyaml = './ID.yaml';
    my $conf = YAML::Syck::LoadFile( $confyaml ) 
        or die( "$confyaml: $!\n" );
     
    my $nodelistbaseyaml = './BrowseNodeIDs-JP.yaml';
    my $nodelistbase = YAML::Syck::LoadFile( $nodelistbaseyaml ) 
        or die( "$nodelistbaseyaml: $!\n" );
     
    unless ( @ARGV ){
        print "BrowseNodeId\tCategory\n";
        foreach my $nodeid ( sort by_number ( keys( %{$nodelistbase} ) ) ){
            print "$nodeid\t$nodelistbase->{$nodeid}\n";
        }
        die( "usage: $0 <browse_node_id> [ <browse_node_id> ...]\n" );
    }
    my $browsenodeid = join( ",", @ARGV ) || '465610';
     
    my $u = URI::Amazon::APA->new( 'http://ecs.amazonaws.jp/onca/xml' );
    $u->query_form(
        Service            => 'AWSECommerceService',
        Operation        => 'BrowseNodeLookup',
        ResponseGroup    => 'BrowseNodeInfo',
        AssociateTag    => $conf->{'ASSOCIATE_TAG'},
        BrowseNodeId    => $browsenodeid,
    );
    $u->sign(
        key    => $conf->{'AWS_ACCESS_KEY_ID'},
        secret => $conf->{'SECRET_ACCESS_KEY'},
    );
     
    my $ua = LWP::UserAgent->new;
    my $r  = $ua->get($u);
    if ( $r->is_success ){
        my $content = XMLin( 
            $r->content, 
            ForceArray    => [ 'BrowseNode', 'Error' ], 
            KeyAttr        => { 'BrowseNode' => '+BrowseNodeId' } 
        );
    #	die( YAML::Syck::Dump( $content ) );
        if ( my $errors = $content->{'BrowseNodes'}->{'Request'}->{'Errors'} ){
            die( YAML::Syck::Dump( $errors ) );
        }
        my $nodelist = $content->{'BrowseNodes'}->{'BrowseNode'};
    #	die( YAML::Syck::Dump( $nodelist ) );
        foreach my $nodeid ( sort by_number ( keys( %{$nodelist} ) ) ){
            my $node = $nodelist->{$nodeid};
            print "Node\t\t$node->{'BrowseNodeId'}\t$node->{'Name'}\n";
            printAncestors( $node );
            my $children = $node->{'Children'}->{'BrowseNode'};
            foreach my $childid ( sort by_number ( keys( %{$children} ) ) ){
                my $child = $children->{$childid};
                print "Child\t\t$child->{'BrowseNodeId'}\t$child->{'Name'}\n";
            }
        }
    } else {
        die( $r->status_line, "\n" );
    }
     
    exit;
     
    sub by_number
    {
      $a <=> $b;
    }
     
    sub printAncestors
    {
        my( $browsenode ) = @_;
        if ( my $ancestors = $browsenode->{'Ancestors'}->{'BrowseNode'} ){
            foreach my $nodeid ( keys( %{$ancestors} ) ){
                my $node = $ancestors->{$nodeid};
                print "Ancestor\t$node->{'BrowseNodeId'}\t$node->{'Name'}\n";
                printAncestors( $node );
            }
        }
    }
     
    # EOF
    

エラーメッセージ対応

  • XML::Simple で下記エラーメッセージが表示される。
    could not find ParserDetails.ini in D:/Perl64/site/lib/XML/SAX
  • 次の行を追加する。
    $XML::Simple::PREFERRED_PARSER = 'XML::Parser';

添付ファイル: fileBrowseNodes2.zip 483件 [詳細] fileBrowseNodes.zip 1166件 [詳細]

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Fri, 23 Sep 2016 15:14:33 JST (577d)