(使用WinXP Pro,ActivePerl 5.10.1和XML-SAX 0.96)
MyXML.xml as this
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<subItem>
<bib>0006</bib>
<name>Stanley Cheruiyot Teimet</name>
<team>肯尼亚</team>
<time>2:17:59</time>
<rank>1</rank>
<comment />
<gender>Male</gender>
<distance>Full</distance>
<year>2010</year>
</subItem>
</DocumentElement>
MyPerl.pl
#!/usr/bin/perl -w
use strict;
use XML::Simple;
use Data::Dumper;
use utf8;
open FILE, ">myXML.txt" or die $!;
my $tree = XMLin('./myXML.xml');
print Dumper($tree);
print FILE "\n";
for (my $i = 0; $i < 1; $i++)
{
print FILE "('$tree->{subItem}->[$i]->{distance}')";
}
close FILE;
输出:
D:\learning\perl\im>mar.pl
$VAR1 = {
'subItem' => {
'distance' => 'Full',
'time' => '2:17:59',
'name' => 'Stanley Cheruiyot Teimet',
'bib' => '0006',
'comment' => {},
'team' => '肯尼亚',
'rank' => '1',
'year' => '2010',
'gender' => 'Male'
}
};
Not an ARRAY reference at D:\learning\perl\im\mar.pl line 41.
我不知道数组引用的含义是什么? Dumper()
效果很好。但是无法将数据打印到TXT文件。
实际上,示例代码在几天前运行良好,然后我记得我从V5升级我的Komodo Edit。到最新的V6。
今天,我只是尝试改进脚本,在开始阶段,我修复了另一个错误。使用谷歌帮助“无法找到ParserDetails.ini”。 (我之前没有收到错误!)
但现在我收到了ARRAY参考错误。我刚刚通过PPM重新安装了我的XML-SAX。它仍然无法正常工作。
答案 0 :(得分:3)
您已设置的整个XML解析堆栈工作正常,因为解析树的转储显示。 XML :: SAX不是问题的原因,它只是间接涉及。
错误来自于对XML :: Simple生成的数据结构的不正确访问。
我可以猜到发生了什么。在程序的早期版本中,您启用了ForceArray
选项(这是一个很好的做法,请参阅XML :: Simple中的OPTIONS和STRICT_MODE)以及遍历解析树也被编写为考虑到这一点,即涉及数组访问。
在您的程序的当前版本中,ForceArray
未启用,但遍历算法不再与数据结构匹配。我建议重新启用文档中建议的选项。
#!/usr/bin/env perl
use utf8;
use strict;
use warnings FATAL => 'all';
use IO::File qw();
use XML::Simple qw(:strict);
use autodie qw(:all);
my $xs = XML::Simple->new(ForceArray => 1, KeyAttr => {}, KeepRoot => 1);
my $tree = $xs->parse_file('./myXML.xml');
{
open my $out, '>', 'myXML.txt';
$out->say;
for my $subitem (@{ $tree->{DocumentElement}->[0]->{subItem} }) {
$out->say($subitem->{distance}->[0]); # 'Full'
}
}
树现在看起来像这样:
{
'DocumentElement' => [
{
'subItem' => [
{
'distance' => ['Full'],
'time' => ['2:17:59'],
'name' => ['Stanley Cheruiyot Teimet'],
'bib' => ['0006'],
'comment' => [{}],
'team' => ["\x{80af}\x{5c3c}\x{4e9a}"],
'rank' => ['1'],
'year' => ['2010'],
'gender' => ['Male']
}
]
}
]
}