Bonjour,
j'ai un fichier xml:
que j'essaie d'analyser avec le module XML::Simple comme suit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <?xml version='1.0' encoding='utf-8'?> <!-- # -*- coding: utf-8 -*- --> <tableau> <element nom="hydrogéne" numero="1" code="H"/> <element nom="hélium" numero="2" code="He"/> <element nom="lithium" numero="3" code="Li"/> </tableau>
j'obtiens le résultat suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 # -*- coding: utf-8 -*- use strict; use warnings; use XML::Simple; # qw(:strict) my $s1=<<EOF1; <?xml version='1.0' encoding='utf-8'?> <!-- # -*- coding: utf-8 -*- --> <tableau> <element nom="hydrogéne" numero="1" code="H"/> <element nom="hélium" numero="2" code="He"/> <element nom="lithium" numero="3" code="Li"/> </tableau> EOF1 my $elts = XMLin( $s1 , ForceArray => 1 , VarAttr => 'name', ContentKey => '-content' ); use Data::Dumper; print Dumper($elts);
J'essaie maintenant de parcourir les éléments de $elts. Ce dernier est un hash, $elts->{'element'} est un tableau, $elts->{'element'}[0] est hash et enfin $elts->{'element'}[0]{'nom'} donne hydrogène.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 $VAR1 = { 'element' => [ { 'nom' => "hydrog\x{e9}ne", 'numero' => '1', 'code' => 'H' }, { 'nom' => "h\x{e9}lium", 'numero' => '2', 'code' => 'He' }, { 'nom' => 'lithium', 'numero' => '3', 'code' => 'Li' } ] };
Pour utiliser les résultat, j'ai utilisé la boucle suivante
ce qui me donne le résultat attendu
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 my @elt=@{$elts->{'element'}}; my $elt=@{$elts->{'element'}}; for my $i (0.. $elt-1 ) { print "$elt[$i]{'nom'}\t$elt[$i]{'code'}\t$elt[$i]{'numero'}\n"; }
ma question est la suivante pourquoi la boucle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 hydrogène H 1 hélium He 2 lithium Li 3
me donne le résultat suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 foreach ( @{$elts->{'element'}} ) { print "$_{'nom'}\n"; }
et pourquoi la boucle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Use of uninitialized value in concatenation (.) or string at ex-3.pl line 52. Use of uninitialized value in concatenation (.) or string at ex-3.pl line 52. Use of uninitialized value in concatenation (.) or string at ex-3.pl line 52.
entraîne une erreur de syntaxe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 foreach my $e ( @{$elts->{'element'}} ) { print "$e{'nom'}\n"; #-- ligne 56 }
merci de votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Global symbol "%e" requires explicit package name at ex-3.pl line 56. Execution of ex-3.pl aborted due to compilation errors.
Partager