在Twig中打印XML内容

4

我正在尝试在Perl中打印一些基本日志,但我遇到了一个非常简单的问题:我无法打印XML标签的内容。

my $twig=XML::Twig->new(pretty_print => "nice");
$twig->parse($xml);
my $root = $twig->root;

my @desc=$root->descendants_or_self('node');
my $nrofdesc=@desc;

my $sentence = $root->descendants('sentence')->print;
my $sentenceid = $root->{att}->{id};

if ($nrofdesc > $maxdescendants) {
  print "$sentence\t$nrofdesc\t$sentenceid\n";
}

我尝试运行上述代码,但收到错误消息:

在file.pl文件的第35行(第15行)出现“无法在包或对象引用中调用print方法”的错误。

该错误是由以下代码引起的:

my $sentence = $root->descendants('sentence')->print;

我也尝试了常见的text,但是我遇到了相同的错误。我错过了什么?


2
根据 perldoc 的说明,descendants 会给你一个列表,而不是一个对象。可能需要遍历该列表并打印每个“twig”。 - LaintalAy
1个回答

3

这不是jQuery ;--( 你需要遍历子元素列表。

此外,你不能使用 print 将数据收集到变量中,你应该使用 sprintf 替代:sprintf 可以将字符串格式化为可变参数的格式并返回一个格式化后的字符串。

$sentence= join '', map { $_->sprint } $root->descendants('sentence');

如果您需要元素的文本,且所有元素的内容都是纯文本,则可以使用 $sentence= $root->findvalue('//sentence')。
此外,使用 $root->att('id') 或 $root->id,因为 $root->{att}->{id} 不是官方 API 的一部分,将来可能发生变化。

但是我事先知道每个根节点只会有一个“句子”元素。那么为什么我不能直接从列表中访问那个项目呢?但你说得对,我想我应该使用sprint,我会研究一下的。编辑; 不,我真的需要“文本”。 - Bram Vanroy
2
如果您知道只有一个句子,或者只关心第一个句子,则使用 $root->first_descendant( 'sentence') 或甚至 $twig->first_elt('sentence') - mirod
太棒了!(我删除了我的答案,这样我就可以接受你的答案了。)问题:当尝试在$root上使用first_elt时,我得到了*Can't locate object method "first_elt" via package "XML::Twig::Elt"*的错误信息。但是当在twig上使用它时,它却可以工作。为什么? - Bram Vanroy
抱歉,我意识到我犯了一个错误,并编辑了我的评论...显然在你读完后。元素 (XML::Twig::Elt) 上的方法是 first_descendant,而不是 first_elt - mirod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接