2012-06-02 131 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