Целый стек для разбора 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']
}
]
}
]
}