【问题标题】:Printing content of XML in Twig在 Twig 中打印 XML 的内容
【发布时间】:2016-08-15 18:42:59
【问题描述】:

我正在尝试在 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";
}

我尝试了上面的代码,但我收到了错误

不能在没有包或对象引用的情况下调用方法“print” file.pl 第 35 行,第 15 行。

这是哪一行:

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

我也尝试了text,正如经常提出的那样,但我得到了同样的错误。我在这里错过了什么?

【问题讨论】:

  • 根据 perldoc descendants 会给你一个列表,而不是一个对象。可能您需要查看打印单个“树枝”的列表。

标签: xml perl xml-twig


【解决方案1】:

这不是 jQuery ;--( 你必须遍历后代列表。

另外,您不能使用print 来收集变量中的数据,您可以使用print 来...打印!请改用sprint

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

如果你想要的是元素的文本,而所有sentence元素的内容都是纯文本,你也可以使用$sentence= $root->findvalue( '//sentence')

另外,请使用 $root->att( 'id')$root->id,因为 $root->{att}->{id} 不是官方 API 的一部分,将来可能会发生变化。

【讨论】:

  • 但我先验地知道每个根只有一个 sentence 元素。那么为什么我不能从列表中访问该项目呢?但是你是对的,我想我应该使用 sprint,我会调查一下。编辑;不,我真的需要text
  • 如果你知道只有一句话,或者如果你只对第一句话感兴趣,那么使用$root->first_descendant( 'sentence')甚至$twig->first_elt( 'sentence')
  • 酷! (我删除了我的答案,所以我可以接受你的答案。) 问题:当尝试在 $root 上使用 first_elt 时,我得到 Can't locate object method "first_elt" via package "XML::Twig::Elt" 。但是在树枝上使用它时它可以工作。怎么样?
  • 对不起,我意识到我犯了一个错误并编辑了我的评论......在你明显阅读之后。元素上的方法 (XML::Twig::Elt) 是 first_descendant,而不是 first_elt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
相关资源
最近更新 更多