2012-09-14 3 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);