Как я могу извлечь дочерние значения из XML с помощью Perl XML :: Twig? - PullRequest
5 голосов
/ 22 сентября 2010

Я анализирую файл XML и пытаюсь получить доступ к значениям в файле XML.

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

Пример XML-файла:

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

Вывод:

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.

Как решить эту проблему?

Есть ли что-то не так в этой строке кода и требуется какая-либо модификация (здесь я пытаюсь получить common-name как Bactrian Camel)

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

Ответы [ 2 ]

6 голосов
/ 22 сентября 2010

Измените последние строки на

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

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

children возвращает массив, поэтому вам нужно запустить его.

Чтобы помочь в отладке, попробуйте следующее:

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 голосов
/ 11 сентября 2011
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();
...