2012-06-02 129 views
1

所以我有一些xml文件是這樣的:遍歷XML ::簡單結構

<?xml version="1.0" encoding="ISO-8859-1"?> 
<root result="0" > 
    <settings user="anonymous" > 
      <s n="blabla1" > 
        <v>true</v> 
      </s> 
      <s n="blabla2" > 
        <v>false</v> 
      </s> 
      <s n="blabla3" > 
        <v>true</v> 
      </s> 
    </settings> 
</root> 

我想用XML的簡單通過所有的設置去。

這裏是我有當我打印用數據::自卸車輸出:

$VAR1 = { 
     'settings' => { 
         'user' => 'anonymous', 
         's' => [ 
           { 
           'n' => 'blabla1', 
           'v' => 'true' 
           }, 
           { 
           'n' => 'blabla2', 
           'v' => 'false' 
           }, 
           { 
           'n' => 'blabla3', 
           'v' => 'true' 
           } 
          ] 
        }, 
     'result' => '0' 
    }; 

這裏是我的代碼

$xml = new XML::Simple; 
$data = $xml->XMLin($file); 
foreach $s (keys %{ $data->{'settings'}->{'s'} }) { 
    print "TEST: $s $data->{'settings'}->{'s'}->[$s]->{'n'} $data->{'settings'}->{'s'}->[$s]->{'v'}<br>\n"; 
} 

,並返回這兩條線,不循環:

TEST: n blabla1 true 
TEST: v blabla1 true 

我也試過這樣做:

foreach $s (keys @{ $data->{'settings'}->{'s'} }) { 

沒有任何成功:

Type of arg 1 to keys must be hash (not array dereference) 

我可以打印:

$data->{'settings'}->{'s'}->[1]->{'n'} $data->{'settings'}->{'s'}->[1]->{'v'} 

對於每種設置,但我無法通過它們循環。

我該怎麼辦?我究竟做錯了什麼?

非常感謝!

回答

4

注意轉儲中的方括號:有一個涉及的數組。

for (@{ $data->{settings}{s} }) { 
    print $_->{n}, ' ', $_->{v}, "\n"; 
} 

如果你不想硬編碼nv,只是解除引用的散列引用運行keys

for my $s (@{ $data->{settings}{s} }) { 
    print join(', ', map "$_ = $s->{$_}", keys %$s), "\n"; 
} 
+0

啊該死的,我離開了這個詞的「鑰匙」,當我試圖解析@array。 – David

+0

假設你不知道他們的鍵「n」和「v」的名字,你會打印出鍵「n」和「v」以及它們各自的值嗎? – swl1020

+0

@ swl1020:你問的是如何在散列引用上運行'keys'? – choroba