XML-SAX错误:不是ARRAY引用

时间:2010-11-09 09:39:24

标签: perl xml-parsing

(使用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。它仍然无法正常工作。

1 个答案:

答案 0 :(得分:3)

您已设置的整个XML解析堆栈工作正常,因为解析树的转储显示。 XML :: SAX不是问题的原因,它只是间接涉及。

错误来自于对XML :: Simple生成的数据结构的不正确访问。

我可以猜到发生了什么。在程序的早期版本中,您启用了ForceArray选项(这是一个很好的做法,请参阅XML :: Simple中的OPTIONSSTRICT_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']
                }
            ]
        }
    ]
}