2010-11-05 152 views
1

我有一个Perl脚本,它读取没有内容的XML文件,只读取元素中的属性。如何使用Perl的XML :: Simple获取XML元素的属性?

像这样:

<league> 
<game name="bla"/> 
</league> 

现在我试图让游戏中的属性 '名'。

我试过使用$xml->{league}->{game}->{name}$xml->{league}->{game}->['name']但他们都不工作。关于哈希问题的一些东西。

有没有人可以帮助我获得价值?

+1

显示您的程序。 – 2010-11-05 17:20:15

回答

4

那么从您发布的XML,我得到这个:

Entity: line 3: parser error : Opening and ending tag mismatch: league line 0 and leage 

它甚至不似乎是一个严格的/警告的问题,因为当我的评论我的USUW出出现。

但是,如果你有正确的标签,这应该工作:

$xml->{game}{name}; 

如果我打电话XMLinKeepRoot => 1,你会在找到它:

$xml->{league}{game}{name}; 

如果您有麻烦定位如何读取数据,请执行以下操作:

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

my $xml = XMLin($input); 
say Data::Dumper->Dump([ $xml ], [ '$xml' ]); 

而且n使用所提供结构的路径。


注: “不是数组引用在” 即使不打开了警告:

$xml->{league}->{game}->['name']; 

应该已经死亡。 ['string']是以字符串'string'作为唯一元素的数组的参考。而且,如果$xml->{league}{game}数组,它将因非数字错误而死亡,因为字符串不会处理数组。

+0

$ xml - > {game} {name};给我一个: 不是parser.pl第22行的HASH参考。 – baklap 2010-11-05 15:06:39

+1

@baklap,参见Data :: Dumper的建议。 – Axeman 2010-11-05 15:27:59

+0

谢谢,把它输出到一个文件。但我明白了什么是错的。我发布的XML只是一个简单的例子,而不是真正的XML。我的错。 出错的事情是有些是{元素}的东西,有些是['名称'](不知道有什么区别)我可以打印{元素}的东西,但[['名字']的东西不可打印,我不知道该怎么做... – baklap 2010-11-05 15:30:01

4

我通常我实例化XML ::简单对象是这样的:

use XML::Simple ':strict'; 
my $xs = XML::Simple->new(KeepRoot => 1, KeyAttr => 1, ForceArray => 1); 

它允许结构是单一的,可能多个子元素之间是一致的。有了这些设置,该代码就会获取你的价值:

#!/usr/bin/perl 
use strict; 
use warnings; 
use XML::Simple ':strict'; 

my $xs = XML::Simple->new(KeepRoot => 1, KeyAttr => 1, ForceArray => 1); 
my $ref = $xs->XMLin('data.xml'); 
print $ref->{league}[0]{game}[0]{name}; 

我又增加了游戏标签,并在联赛标签作为一个例子中的属性,这是XML:

<league name="baz"> 
    <game name="bla"/> 
    <game name="foo"/> 
</league> 

和数据: :Dumper的输出是:

$VAR1 = { 
      'league' => [ 
         { 
         'game' => [ 
            { 
            'name' => 'bla' 
            }, 
            { 
            'name' => 'foo' 
            } 
           ], 
         'name' => 'baz' 
         } 
        ] 
     }; 
+0

设置'KeyAttr => 1'没有什么意义。也许你的意思是'KeyAttr => {}'。 – 2010-11-07 20:21:24

+1

KeyAttr => [],相反,我猜'1'会破坏名为'1'的XML标签 – MkV 2010-11-14 02:20:53