Есть XML файл, который нужно разобрать и потом разнести в базу. При попытке разобрать вылетает ошибка "Not an ARRAY reference at test.pl line 24.". Получается, что есть массив:$data -> {body}->{operation}->[$i]->{linedoc}->[$j]->{good}
просмотр по индексу проходит без проблем, а когда пытаешься просмотреть по индексу $j возникает ошибка.
Ниже формат XML и скрипт для разбора.
$VAR1 = {
'body' => {
'operation' => [
{
'referenceNo' => '893801-',
'store' => "\x{441}\x{43a}\x{43b}6",
'dateDoc' => '06.10.2008',
'saleSum' => {
'sumb' => '1380',
'sumr' => '1380'
},
'docSum' => {
'sumb' => '1380',
'sumr' => '1380'
},
'firm' => "\x{447}\x{435}\x{43b}64",
'linedoc' => [
{
'saleSum' => {
'sumb' => '1296',
'sumr' => '1296'
},
'docSum' => {
'sumb' => '1296',
'rateSLT' => '00',
'sumr' => '1296',
'rateVAT' => '00'
},
'quantity' => '72',
'place' => '0',
'unitType' => "\x{434}\x{440}\x{43e}",
'good' => '109121',
'costSum' => {
'sumb' => '1296',
'sumr' => '1296'
},
'wait' => '0',
'type' => "\x{442}"
},
{
'saleSum' => {
'sumb' => '84',
'sumr' => '84'
},
'docSum' => {
'sumb' => '84',
'rateSLT' => '00',
'sumr' => '84',
'rateVAT' => '00'
},
'quantity' => '12',
'place' => '0',
'unitType' => "\x{448}\x{442}\x{443}",
'good' => '131535',
'costSum' => {
'sumb' => '84',
'sumr' => '84'
},
'wait' => '0',
'type' => "\x{442}"
}
],
'dateFact' => '06.10.2008',
'host' => '1',
'codeOperation' => 'we',
'costSum' => {
'sumb' => '1380',
'sumr' => '1380'
},
'comment' => '@ ',
'paymentCode' => '1',
'valutCode' => '0'
},
{
'referenceNo' => '891954-',
'store' => "\x{441}\x{43a}\x{43b}6",
'dateDoc' => '03.10.2008',
'saleSum' => {
'sumb' => '19200',
'sumr' => '19200'
},
'docSum' => {
'sumb' => '19200',
'sumr' => '19200'
},
'firm' => "\x{43e}\x{440}\x{433}187",
'linedoc' => {
'saleSum' => {
'sumb' => '19200',
'sumr' => '19200'
},
'docSum' => {
'sumb' => '19200',
'rateSLT' => '00',
'sumr' => '19200',
'rateVAT' => '00'
},
'quantity' => '50',
'place' => '0',
'unitType' => "\x{448}\x{442}\x{443}",
'costSum' => {},
'good' => '122442',
'comment' => "\x{432}\x{435}\x{441} \x{43a}\x{433} \x{432} \x{43f}\x{430}\x{43b}\x{43b}\x{435}\x{442}\x{435} 48 \x{448}\x{442}",
'wait' => '0',
'type' => "\x{442}"
},
'dateFact' => '07.10.2008',
'host' => '1',
'codeOperation' => 'we',
'costSum' => {},
'comment' => "\x{421}\x{442}\x{440}\x{43e}\x{439}\x{43a}\x{430} \x{441}\x{43a}\x{43b}\x{430}\x{434}\x{430}.",
'paymentCode' => '1',
'valutCode' => '0'
}
#!/usr/bin/perl
use XML::Simple;
use Data::Dumper;
use Text::Iconv;
use Encode ;
my $simple = XML::Simple->new();
my $file ='DOCUMENT.XML';
$file = encode('cp1251', $file);
my $data = $simple->XMLin($file);
my $cv = Text::Iconv->new('utf-8','windows-1251');
my $i=0;
my $j=0;
while ($data -> {body}->{operation}->[$i]) {
++$i;
};
my $doc_max=$i;
foreach ($i=0;$i<$doc_max;$i++){
$j=0;
my $nam = $cv->convert($data -> {body}->{operation}->[$i]->{referenceNo});
while ($data -> {body}->{operation}->[$i]->{linedoc}->[$j]) {
print "$i:$j\n";
print ($data -> {body}->{operation}->[$i]->{linedoc}->[$j]->{good});
++$j;
};
};
# END