xml - 如何使用 Perl 的 XML::Twig 从 XML 中提取子值?

标签 xml perl xml-twig

我正在解析 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');

最佳答案

将最后一行更改为

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');
}

关于xml - 如何使用 Perl 的 XML::Twig 从 XML 中提取子值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3766573/

相关文章:

python - 我如何在 Python 中使用 LXML 捕获 XML 文件的所有元素名称?

perl - 如何通过指定其解析树来创建 perl 子?

mysql - DBIx 迁移无法识别 MySQL

perl - 如何使用 Perl 的 XML::Twig 选择同级(xpath 语法)?

perl - $twig->purge 给出空文件

XML Twig 不会缩进新添加的元素?

java - Android java,使用getString()从string.xml导入字符串时出错

php - 在 PHP echo 语句中使用 JS 'onclick' 函数并嵌入 XML 获取的正确语法

objective-c - 使用 NSData 解析 xml

perl - Inline::Java 与 Parallel::ForkManager 冲突