Ошибка XML-SAX: не ссылка на массив - PullRequest
0 голосов
/ 09 ноября 2010

(используются WinXP Pro, ActivePerl 5.10.1 и XML-SAX 0.96)

MyXML.xml как этот

<?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.

На самом деле, пример кода работал хорошо несколько дней назад. Тогда я помню, что обновляю свой Komodo Edit с V5. до новейшего V6.

Сегодня я просто пытаюсь улучшить скрипт, на начальном этапе я исправил еще одну ошибку. "Не удалось найти ParserDetails.ini" с помощью Google. (Я не получил ошибку раньше!)

Но теперь я получаю ошибку ссылки на массив. Я уже переустановил свой XML-SAX через PPM только сейчас. Это все еще не работает.

1 Ответ

3 голосов
/ 09 ноября 2010

Целый стек для разбора XML, который вы настроили, работает нормально, как показывает дамп проанализированного дерева. XML :: SAX не является причиной проблемы, и он задействован только косвенно.

Ошибка возникает просто из-за неправильного доступа к структуре данных, сгенерированной XML :: Simple.

Я могу догадаться, что случилось. В более ранней версии вашей программы у вас была включена опция ForceArray (это хорошая практика, см. OPTIONS и STRICT_MODE в XML :: Simple) и алгоритм для Обход проанализированного дерева также был написан, чтобы принять это во внимание, то есть задействован доступ к массиву.

В текущей версии вашей программы 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']
                }
            ]
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...