2013-02-26 2 views
2

XML을 파싱 할 때 잘못된 동작을하고 있습니다. 어쨌든 두 개의 루프를 반복해야하는데, 오직 하나만 필요합니다. 여기서 내가 뭘 잘못하고 있니?perl, XML :: Simple을 사용하여 XML 구문 분석하기

먼저 XML 데이터 :

<fishy> 
    <fish displayName   = "Scalar" 
     description   = "the first fish I bought." 
    /> 
    <fish displayName   = "crystal red" 
     description   = "not really a fish." 
    /> 
</fishy> 

그럼 내 펄 코드 :

#!/usr/bin/perl -w 
use strict; 
use XML::Simple; 
use Data::Dumper; 

#Read configuration 
my $simple = XML::Simple->new(); 
my $data = $simple->XMLin('test.xml'); 
print Dumper($data) . "\n"; 


my @fishes = $data->{fish}; 

#This is weird.. Why do we have nested arrays? 
foreach my $fish (@fishes) 
{ 
    foreach my $innerFish (@{$fish}) 
    { 
    print ("\n" . $innerFish->{displayName} . " is " . $innerFish->{description}); 
    } 
    print ("\n"); 
} 

그리고 (괜찮습니다) 마지막으로 응답

$VAR1 = { 
      'fish' => [ 
        { 
         'description' => 'the first fish I bought.', 
         'displayName' => 'Scalar' 
        }, 
        { 
         'description' => 'not really a fish.', 
         'displayName' => 'crystal red' 
        } 
        ] 
     }; 


Scalar is the first fish I bought. 
crystal red is not really a fish. 
+0

없으면 어떻게됩니까? –

답변

4

당신은 하나의 배열을 만들 요소 (배열에 대한 참조)는

my @fishes = $data->{fish}; 

은 그럼 당신은

foreach my $fish (@fishes) 
의 그를 사용하자,하지만 $fishes$fish의 이름을 변경
my $fish = $data->{fish}; 

을하고 그냥 정말 이상한 방법

$innerFish에와 그 배열의 요소를 반복 $fish. 당신은 단지 하나의 물고기가있을 때

my $fishes = $data->{fish}; 
for my $fish (@$fishes) { 
    print($fish->{displayName}, " is ", $fish->{description}, "\n"); 
} 

확실히 코드가 작동하는지 확인하기 위해 ForceArray => [qw(fish)] 옵션을 사용하는 것을 잊지 마십시오.

+0

ikegami – daljian

0

+1

ug, 불필요한 어레이 사본을 보내 주셔서 감사합니다. 그건 완전히 낭비입니다. – ikegami