2013-09-30 22 views
5

Mam następujący plik xmlPerl xml proste do analizowania węzeł o takiej samej nazwie

<?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> 

ja zmęczony, żeby pars to za pomocą XML prosty z następującego kodu, który siedzę od jednego z węzłów miał 2 grafiki elementy. Więc narzeka. Zakładam, że muszę mieć kolejną pętlę foreach dla elementów graficznych, ale nie wiem, jak postępować.

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";    
} 

tutaj jest wynikiem kod

$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. 

Odpowiedz

7

XML::Simple brakuje spójności, ponieważ to zależy od użytkownika, aby umożliwić strict mode, więc graphics węzeł jest czasem mieszania, czasami tablica w zależności od liczby elementów podrzędnych.

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

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

Są lepsze moduły do ​​analizowania XML, sprawdź XML::LibXML

lub @RobEarl Sposób użycia ForceArray parametr:

XMLin("file.xml",KeyAttr => ['id'], ForceArray => [ 'graphics' ]); 
Powiązane problemy