1
sub parse_xml{
    my $xml_link = $_[0];
    my $xml_content = get($xml_link) or warn "Cant get XML page of " . $xml_link . "\n";
    if(!$xml_content){
        return;
    }
    my $xml =  XML::Simple->new(KeepRoot => 1);
    my $xml_data = $xml->XMLin($xml_content);
    my @items = $xml_data->{rss}{channel}->{item};
   # print Dumper($xml_data);
    foreach my $item (@items) {
        if($item){
             print Dumper($item);             //This is the dump output
             print $item->{author};
             #print $item . "\n";
        }
    }
}

アイテムの作成者を出力しようとすると、HASH(Memory Address)またはnot a hash reference at ... line ...

私はこれを間違ってやっていますか?なぜこのエラーが発生するのですか?

これがダンパー出力です。

$VAR1 = [
          {
            'link' => 'http://***.com/article/news/betty-white-credits-snickers-golden-opportunities/144290/#comments-67229',
            'author' => {},
            'title' => 'By: ',
            'pubDate' => 'Tue, 08 Jun 2010 12:47 EDT',
            'description' => 'Interesting. At least SHE remembered the product that propelled her to recent recognition. When many people I know have commented on how they loved that Betty White Super Bowl spot, they can't recall the product. Ah, advertising.'
          },
          {
            'link' => 'http://***.com/article/news/betty-white-credits-snickers-golden-opportunities/144290/#comments-67167',
            'author' => {},
            'title' => 'By: ',
            'pubDate' => 'Mon, 07 Jun 2010 13:26 EDT',
            'description' => 'Fun, fun, fun. A great attitude for all of us to take into our careers.'
          },
          {
            'link' => 'http://****.com/article/news/betty-white-credits-snickers-golden-opportunities/144290/#comments-67164',
            'author' => 'username',
            'title' => 'By: username',
            'pubDate' => 'Mon, 07 Jun 2010 12:23 EDT',
            'description' => 'Her appearance of the Comedy Central roast of William Shattner a couple of years ago was great... it seems like her willingness to be irreverent makes her more appealing to us all!  

www.adverspew.com'
          },
          {
            'link' => 'http://****.com/article/news/betty-white-credits-snickers-golden-opportunities/144290/#comments-67142',
            'author' => {},
            'title' => 'By: ',
            'pubDate' => 'Mon, 07 Jun 2010 09:50 EDT',
            'description' => 'Solid interview. I will definitely be tuning into "Hot in Cleveland" next week. We ought to enjoy Ms. White's talents for as long as we have her. She's great!'
          }
        ];
4

2 に答える 2

1

<author>この RSS フィードには、各アイテムの情報がある場合とない場合があります。

作成者がいない場合、要素は引き続き XML に表示されますが、コンテンツはありません。として表示され<author></author>ます。

XML::Simpleこれを空の匿名ハッシュとして表します。

したがって、アイテムの作成者情報がある場合は$item->{author}、単純なテキスト文字列になります。それ以外の場合は、ハッシュ参照になります。

これをコーディングするには、次のように記述します。

foreach my $item (@items) {
  my $author = $item->{author};
  $author = '' if ref $author;
  print "$item\n";
}
于 2012-06-06T02:01:27.417 に答える
1

あなたは非常に正しい軌道に乗っています。この StackOverflow ページからリンクされたニュースフィードでコードを使用し、ごくわずかに変更しました。

use LWP::Simple;
use XML::Simple;
use Data::Dumper;
sub parse_xml{
    my $xml_link = $_[0];
    my $xml_content = get($xml_link) or warn "Cant get XML page of " . $xml_link . "\n";
    if(!$xml_content){
        return;
    }
    my $xml =  XML::Simple->new(KeepRoot => 1);
    my $xml_data = $xml->XMLin($xml_content,ForceArray =>'entry');
    foreach my $item ($xml_data->{'feed'}[0]->{'entry'}) {
        foreach my $entry (@{$item}){
            if($entry){
                print $entry->{'author'}[0]->{'name'}[0]."\n";
                print $entry->{'author'}[0]->{'uri'}[0]."\n";
            }
        }

    }

}
parse_xml('http://stackoverflow.com/feeds/question/10906521');

その例ではうまくいきます。単純な値ではないものを印刷しようとしているのではないかと思います。stackoverflow ページの例では、'author' に実際にいくつかの子ノードが含まれていることがわかります。 ->{'author'} foreach ループで、記述した 'HASH' の結果が得られます。

あなたのダンプとボロディンの賢明なコメントを見ると、これはうまくいくはずです:

   my $xml_data = $xml->XMLin($xml_content,ForceArray =>'entry');
    my $item = $xml_data->{'rss'}[0]->{'channel'}[0]->{'item'};
    foreach my $entry (@{$item}){
        if($entry){
            if(!ref $entry->{'author'}[0]){
                    print $entry->{'author'}[0]."\n";
            }
            if(!ref $entry->{'description'}[0]){
                    print $entry->{'description'}[0]."\n";
            }
            if(!ref $entry->{'pubDate'}[0]){
                    print $entry->{'pubDate'}[0]."\n";
            } # etc.
        }
于 2012-06-06T00:18:34.193 に答える