我有一个Perl脚本,它读取的XML文件没有内容,只有元素中的属性。
像这样:
<league>
<game name="bla"/>
</league>
现在我尝试将游戏属性命名为“name”。
我尝试使用$xml->{league}->{game}->{name}
和$xml->{league}->{game}->['name']
,但它们都无效。关于哈希问题的一些事情。
有没有人可以帮助我获得价值?
答案 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'
}
]
};