2010-11-09 14 views
0

(Pro Windows XP, ActivePerl 5.10.1 et XML SAX 0,96 utilisé)XML SAX Erreur: pas un tableau de référence

MyXML.xml que cette

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

sortie:

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. 

Je ne sais pas ce que e e moyen de référence tableau? Le Dumper() fonctionne bien. Mais ne peut pas imprimer les données au fichier TXT.

En fait, l'exemple de code a bien fonctionné quelques jours auparavant, alors je me souviens d'avoir mis à jour mon Komodo Edit à partir de V5. au plus récent V6.

Aujourd'hui, j'essaie juste d'améliorer le script, au début, j'ai corrigé une autre erreur. "Impossible de trouver ParserDetails.ini" avec l'aide de Google. (Je n'ai pas eu l'erreur avant!)

Mais maintenant je reçois l'erreur de référence ARRAY. J'ai déjà réinstallé mon XML-SAX via PPM tout à l'heure. Ça ne marche toujours pas.

Répondre

3

La pile complète pour l'analyse XML que vous avez configurée fonctionne correctement, comme le montre la sauvegarde de l'arborescence analysée. XML :: SAX n'est pas la cause du problème et n'est impliqué qu'indirectement.

L'erreur provient simplement d'un accès incorrect à la structure de données générée par XML :: Simple.

Je peux deviner ce qui s'est passé. Dans une version antérieure de votre programme, vous aviez l'option ForceArray activée (c'est une bonne pratique, voir OPTIONS et STRICT_MODE dans XML :: Simple), et l'algorithme pour traverser l'arbre analysé a également été écrit pour en tenir compte, à savoir il y a un accès au tableau impliqué.

Dans la version actuelle de votre programme, ForceArray n'est pas activé, mais l'algorithme de déplacement ne correspond plus à la structure de données. Je suggère de réactiver les options qui sont recommandées dans la documentation.

#!/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' 
    } 
} 

L'arbre ressemble à ceci maintenant:

{ 
    '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'] 
       } 
      ] 
     } 
    ] 
} 
+0

Bonjour Monsieur, votre code fonctionne très bien. Et finalement, j'ai trouvé que mon code original fonctionne bien SEULEMENT quand le sous-élément Xml est nommé avec Caps Letters. Comme * bavoir * -> * Bavoir *; * nom * -> * Nom *. Le nom et le nom du fichier proviennent de mon fichier Excel. Je ne connais pas la règle spéciale de nommage des majuscules. C'est pourquoi je rencontre ce problème. Merci quand même, tu m'as appris 'FourceArray'. –