2013-09-30 15 views
5

ho il seguente file XMLPerl XML semplice per analizzare nodo con lo stesso nome

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

mi stanco di pars esso utilizzando XML semplice con il seguente codice, che mi sono bloccato dal momento che uno dei nodi avevano 2 grafica elementi. Quindi si lamenta. Suppongo di dover avere un altro ciclo foreach per elementi grafici ma non so come procedere.

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

ecco il risultato codice

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

risposta

7

XML::Simple manca coerenza perché è compito dell'utente per abilitare strict mode, così graphics nodo è talvolta hash, talvolta matrice seconda del numero di elementi secondari.

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

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

ci sono moduli migliori per il parsing XML, verificare XML::LibXML

o come @RobEarl suggerito l'uso ForceArray parametro:

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