2013-09-30 43 views
5

Ben düğümlerden biri 2 grafiğini vardı ben şaşırıp aşağıdaki kodla basit xml kullanarak parsPerl xml

<?xml version="1.0"?> 
<!DOCTYPE pathway SYSTEM "http://www.kegg.jp/kegg/xml/KGML_v0.7.1_.dtd"> 
<pathway name="path:ko01200" org="ko" > 
    <entry id="1" > 
     <graphics name="one" 
      type="circle" /> 
    </entry> 
    <entry id="7" > 
     <graphics name="one" 
      type="rectangle" /> 
     <graphics name="two" 
      type="rectangle"/> 
    </entry> 
</pathway> 

Yorgunum aşağıdaki xml dosyası var elementler. Bu yüzden şikayet ediyor. Grafik elemanları için başka bir foreach döngüsüne sahip olmam gerektiğini düşünüyorum ama nasıl devam edeceğimi bilmiyorum. Burada

use strict; 
use warnings; 
use XML::Simple; 
use Data::Dumper; 

my $xml=new XML::Simple; 
my $data=$xml->XMLin("file.xml",KeyAttr => ['id']); 
print Dumper($data);  
foreach my $entry ( keys %{$data->{entry}}) { 
    print $data->{entry}->{$entry}->{graphics}->{type}."\n";    
} 

yüzden graphics düğüm, bazen alt öğelerin sayısına bağlı olarak bazen dizi karma, bu strict mode etkinleştirmek için yukarı kullanıcıya çünkü

$VAR1 = { 
     'entry' => { 
       '1' => { 
         'graphics' => { 
             'name' => 'one...', 
             'type' => 'circle' 
            } 
         }, 
       '7' => { 
         'graphics' => [ 
             { 
             'name' => 'one', 
             'type' => 'rectangle' 
             }, 
             { 
             'name' => 'two', 
             'type' => 'rectangle' 
             } 
            ] 
         } 
       }, 
     'org' => 'ko', 
     'name' => 'path:ko01200' 
    }; 
circle 
Not a HASH reference at stack.pl line 12. 

cevap

7

XML::Simple tutarlılık yoksun kod sonucudur.

XMLin("file.xml",KeyAttr => ['id'], ForceArray => [ 'graphics' ]); 
:

for my $entry (keys %{$data->{entry}}) { 

    my $graphics = $data->{entry}{$entry}{graphics}; 
    $graphics = [ $graphics ] if ref $graphics eq "HASH"; 
    print "$_->{type}\n" for @$graphics; 
} 

XML::LibXML

kontrol ediniz veya @RobEarl kullanacağım ForceArray parametresini önerildiği gibi, XML ayrıştırma için daha iyi modül vardır