2012-10-15 23 views
0

我试图解析XML文件。 Xml文件可以在@http://pastebin.com/fvuwbrh9找到。 我已将这个xml文件保存为packages.xmlXML ::简单:解析嵌套的哈希值/阵列

目标:列出所有被<packagereq>标签在XML(我指其归入group在自卸车输出packagereq)包围的名称。

我写了下面的脚本调用rpm.pl

#!/usr/bin/perl -w 

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

my $ref = XMLin ('packages.xml'); 
#print Dumper ($ref); 

foreach my $a (keys %{ $ref->{group} }) 
{ 
    if (exists $ref->{group}->{$a}->{packagelist}) 
    { 
     foreach my $b (@{ $ref->{group}->{$a}->{packagelist}->{packagereq} }) 
     { 
      print $b->{content}."\n"; ### <<< referring the Dumper out put 
     } 
    } 
} 

现在我的剧本要中途throgh并打印包名,但随后被下面的错误终止:

Not an ARRAY reference at rpm.pl line 29. 

上述错误之后,该脚本不会处理XML文件的其余部分并终止。

上面的错误使我相信的$ref->{group}->{$a}->{packagelist}->{packagereq}冥冥中值不是一个数组引用。

我已经为carefuly我可以throguh XML文件(或翻车机输出),但发现packagereq始终指向数组引用,除非当然,我忽略了一些,但我怀疑如此。

你能否提供关于为什么会抱怨Not an ARRAY ref一些输入。

谢谢。

回答

3

XML ::简单,最复杂的XML解析器使用。添加以下内容:

my $ref = XMLin ('packages.xml', 
    KeyAttr => [qw(id)], 
    ForceArray => [qw(group packagereq ignoredep)], 
); 
+0

就是这样。非常感谢。顺便说一下,你推荐哪个模块读取perl中的XML文件? – slayedbylucifer

+0

我使用XML :: LibXML。有点罗嗦,但没有意外。它还允许您使用最强大的XPath查询。 – ikegami

+0

那么,我将通过使用XML :: LibXML重写上面的脚本来立即给出它。谢谢。 – slayedbylucifer