2010-06-04 11 views
1

Mon data.xmlComment analyser XML ues fichier XML d'enregistrement multiples :: Simple en Perl

<?xml version="1.0" encoding="ISO-8859-1"?> 
<catalog> 
    <cd country="UK"> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <price>10.0</price> 
    </cd> 
    <cd country="CHN"> 
    <title>Greatest Hits</title> 
    <artist>Dolly Parton</artist> 
    <price>9.99</price> 
    </cd> 
    <cd country="USA"> 
    <title>Hello</title> 
    <artist>Say Hello</artist> 
    <price>0001</price> 
    </cd> 
</catalog> 

mon test.pl

#!/usr/bin/perl 

    # use module 
    use XML::Simple; 
    use Data::Dumper; 

    # create object 
    $xml = new XML::Simple; 

    # read XML file 
    $data = $xml->XMLin("data.xml"); 

    # access XML data 
    print "$data->{cd}->{country}\n"; 
    print "$data->{cd}->{artist}\n"; 
    print "$data->{cd}->{price}\n"; 
    print "$data->{cd}->{title}\n"; 

Sortie:

Not a HASH reference at D:\learning\perl\t1.pl line 16. 

Commentaire: J'ai googlé et trouvé l'article (gérer un seul enregistrement xml). http://www.go4expert.com/forums/showthread.php?t=812 J'ai testé avec le code article, ça marche plutôt bien sur mon portable.

Puis j'ai créé mon code de pratique ci-dessus pour essayer d'accéder à plusieurs enregistrements. mais a échoué. Comment puis-je le réparer? Je vous remercie.

+2

Voici quelques astuces pratiques: http://www.perlmonks.org/index.pl?node_id=218480 –

Répondre

5

Toujours use strict; , toujours use warnings; Ne citez pas de références complexes comme vous le faites. Vous avez raison de use Dumper;, il aurait dû vous montrer que cd était un tableau ref - vous devez spécifier quel CD.

#!/usr/bin/perl 
use strict; 
use warnings; 

# use module 
use XML::Simple; 
use Data::Dumper; 

# create object 
my $xml = new XML::Simple; 

# read XML file 
my $data = $xml->XMLin("file.xml"); 

# access XML data 
print $data->{cd}[0]{country}; 
print $data->{cd}[0]{artist}; 
print $data->{cd}[0]{price}; 
print $data->{cd}[0]{title}; 
+0

Merci pour la dissection détaillée. –

2

Si vous print Dumper($data), vous verrez que la structure de données ne ressemble pas à vous pensez qu'il fait:

$VAR1 = { 
      'cd' => [ 
        { 
        'country' => 'UK', 
        'artist' => 'Bonnie Tyler', 
        'price' => '10.0', 
        'title' => 'Hide your heart' 
        }, 
        { 
        'country' => 'CHN', 
        'artist' => 'Dolly Parton', 
        'price' => '9.99', 
        'title' => 'Greatest Hits' 
        }, 
        { 
        'country' => 'USA', 
        'artist' => 'Say Hello', 
        'price' => '0001', 
        'title' => 'Hello' 
        } 
       ] 
     }; 

Vous devez accéder aux données comme ceci:

print "$data->{cd}->[0]->{country}\n"; 
print "$data->{cd}->[0]->{artist}\n"; 
print "$data->{cd}->[0]->{price}\n"; 
print "$data->{cd}->[0]->{title}\n"; 
2

En plus de ce qui a été dit par Evan, si vous n'êtes pas sûr si vous êtes coincé avec un ou plusieurs éléments, ref() peux vous dire ce qu'elle est, et vous pouvez le manipuler en conséquence: