2010-09-22 7 views
5

Je suis en train d'analyser le fichier XML et d'essayer d'accéder aux valeurs dans le fichier XML.Comment puis-je extraire des valeurs enfants à partir de XML avec XML :: Twig de Perl?

fichier XML exemple
#!/usr/bin/perl -w 

use strict; 
use XML::Twig; 

my $file = 'files/camelids.xml'; 
print "File :: $file\n"; 
my $twig = XML::Twig->new(); 

$twig->parsefile($file); 
# print "twig :: $twig\n"; 

my $root = $twig->root; 
# print "root :: $root\n"; 

my $num = $root->children('species'); 
print "num :: $num\n\n\n"; 

print $root->children('species')->first_child_text('common-name'); 

est:

<?xml version="1.0"?> 
<camelids> 
    <species name="Camelus bactrianus"> 
    <common-name>Bactrian Camel</common-name> 
    <physical-characteristics> 
     <mass>450 to 500 kg.</mass> 
     <appearance> 
      <in-appearance> 
       <inside-appearance>This is in inside appearance</inside-appearance> 
      </in-appearance> 
     </appearance> 
    </physical-characteristics> 
    </species> 
</camelids> 

sortie est:

File :: files/camelids.xml 
num :: 1 


Can't call method "first_child_text" without a package or object reference at xml-twig_read.pl line 19. 

Comment résoudre ce problème?

Y at-il quelque chose de mal dans cette ligne de code et toute modification nécessaire (ici, je suis en train d'obtenir le common-name comme Bactrian Camel)

print $root->children('species')->first_child_text('common-name'); 

Répondre

6

Modifiez les dernières lignes à

my @nums = $root->children('species'); 
print "num :: @nums\n\n\n"; 

foreach my $num (@nums) { 
print $num->first_child_text('common-name'); 
} 

retours enfants un tableau, vous avez donc besoin de courir dessus.

Pour aider le débogage, essayez ceci:

my @nums = $root->children('species'); 
use Data::Dumper; #More debug information like this than a normal print 
print Dumper @nums; 

foreach my $num (@nums) { 
print $num->first_child_text('common-name'); 
} 
2
use XML::Twig; 

my $file = 't2.xml'; 

print "File :: $file\n"; 
# exit(); 
my $twig = XML::Twig->new(); 

$twig->parsefile($file); 
# print "twig :: $twig\n"; 

my $root = $twig->root; 
# print "root :: $root\n"; 

my @nums = $root->children('species'); 
*print "num :: " . @nums . "\n\n\n";* 

foreach my $num (@nums){ 
    print $num->first_child_text('common-name') . *"\n";* 
} 
#exit();