2012-09-14 45 views
1

我剛剛學習PERL。我已經閱讀了解析XML的一些文檔,並重用了我的一些同事的代碼。但我似乎無法打印出這個數據中的3個足球運動員名單。請幫忙。這裏是PERL代碼:通過Perl解析XML數據

#! /usr/bin/perl -w 
use strict; 
use DBI; 
use XML::Simple; 
use LWP::UserAgent; 
use HTTP::Request; 
use Time::gmtime; 
use Time::Local; 
use Data::Dumper; 

sub statsInit(){ 
    my $xml_api_url = "http://myprovider.com/nfldata.xml"; 
    my $xml = getXML($xml_api_url); 
    my $xmlData = xml2Simple($xml); 
    print "Hello World"; 
    foreach my $player (@{$xmlData->{player}}){ 
    my $playername = $player->{name}; 
    print "pn = $playername | "; 
    } 
} 


sub getXML($){ 
    my ($xmlURL) = @_; 
    my $dataresponse = ''; 
    my $agent = LWP::UserAgent->new(env_proxy => 1, keep_alive => 1, timeout => 100); 
    my $header = HTTP::Request->new(GET => $xmlURL); 
    my $request = HTTP::Request->new('GET', $xmlURL, $header); 
    my $response = $agent->request($request); 
    if($response->is_success){ 
     $dataresponse = $response->content(); #Loaded data from FINAL_XML 
    } 
    return $dataresponse; 
} 

sub xml2Simple(){ 
    my ($xml) = @_; 
    my $xmlObj = XML::Simple->new(KeyAttr => {}); 
    my $xmlData = ''; 
    my $parsedData = ''; 
    if($xml){ 
     $xmlData = $xmlObj->XMLin($xml); 
    } 
    return $xmlData; 
} 

statsInit(); 
-------- NOW BELOW IS THE RETRIEVED XML DATA -------- 
    <season xmlns="http://myprovider.com/schema/nfl/statistics-v1.0.xsd" season="2012" season_type="REG"> 
<team id="BUF" name="Bills" market="Buffalo"> 
    <players> 
     <player id="100" name="Nick Barnett" games_played="1" games_started="1" jersey="50" position="OLB"> 
      <defense tackle="7" ast="2" /> 
     </player> 
     <player id="101" name="Ryan Fitzpatrick" games_played="1" games_started="1" jersey="14" position="QB"> 
      <rushing att="2" yds="8" /> 
      <passing att="32" cmp="18" yds="195" td="3" int="3"/> 
     </player> 
     <player id="102" name="Fred Jackson" games_played="1" games_started="1" jersey="22" position="RB"> 
      <rushing att="6" yds="15" td="0"/> 
     </player> 
    </players> 
</team> 
</season> 

所以我的代碼似乎檢索數據好,我沒有得到任何錯誤。 「Hello World」被打印出來。但它永遠不會進入玩家循環,也不會打印任何玩家的名字。我究竟做錯了什麼?

+0

該語言的名稱是「Perl」。 – ikegami

+0

我在代碼中的任何地方都看不到' - > {players}'... – ikegami

回答

1

我想通了。我想我必須改變這一行。

foreach my $player (@{$xmlData->{player}}){ 

這樣:

foreach my $player (@{$xmlData->{team}{players}{player}}){ 
0

另一種選擇是繞過整個文檔解析到一個數據結構,只是分析,處理和忘記每一個記錄,當您去:

use strict; 
use warnings; 

use XML::Rules; 

my @rules = (
    player => sub { 
    my $p = $_[1]; 
    print "$p->{name}\n"; 
    return; 
    }, 
    _default => undef, 
); 
my $xr = XML::Rules->new(rules => \@rules); 
$xr->parse($xml);