utilisation de Simple::XML
Bonjour,
j'ai un fichier xml:
Code:
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> |
que j'essaie d'analyser avec le module XML::Simple comme suit:
Code:
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'obtiens le résultat suivant:
Code:
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'
}
]
}; |
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.
Pour utiliser les résultat, j'ai utilisé la boucle suivante
Code:
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";
} |
ce qui me donne le résultat attendu
Code:
1 2 3
| hydrogène H 1
hélium He 2
lithium Li 3 |
ma question est la suivante pourquoi la boucle
Code:
1 2 3
| foreach ( @{$elts->{'element'}} ) {
print "$_{'nom'}\n";
} |
me donne le résultat suivant:
Code:
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. |
et pourquoi la boucle
Code:
1 2 3
| foreach my $e ( @{$elts->{'element'}} ) {
print "$e{'nom'}\n"; #-- ligne 56
} |
entraîne une erreur de syntaxe
Code:
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. |
merci de votre aide
utilisation de Simple::XML
Merci beaucoup :ccool::ccool::ccool:
Quel module doit-on utiliser pour traiter plus facilement les attributs ?
Plus généralement je cherche une présentation et une comparaison des différents modules de Perl pour traiter les documents XML, suivant les critères pourraient être
Encore merci