如何使用Perl的XML :: Simple获取XML元素的属性?

时间:2010-11-05 14:34:12

标签: xml perl

我有一个Perl脚本,它读取的XML文件没有内容,只有元素中的属性。

像这样:

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

现在我尝试将游戏属性命名为“name”。

我尝试使用$xml->{league}->{game}->{name}$xml->{league}->{game}->['name'],但它们都无效。关于哈希问题的一些事情。

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

2 个答案:

答案 0 :(得分:4)

嗯,从您发布的XML中,我得到了这个:

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

它甚至不是严格/警告问题,因为它在我评论我的USUW时出现。

但如果你有正确的标签,这应该有效:

$xml->{game}{name};

如果我使用XMLin致电KeepRoot => 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' ] );

然后使用所显示结构的路径。


注意:

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

应该已经死了:“即使没有启用警告,也不是”ARRAY引用“。 ['string']是对字符串'string'作为唯一元素的数组的引用。而且,如果$xml->{league}{game} 一个数组,它会因非数字错误而死亡,因为字符串不会解决数组。

答案 1 :(得分:4)

我通常会实例化我的XML :: Simple对象:

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>

Data :: Dumper输出为:

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