Bram Vanroy Bram Vanroy - 1 year ago 54
Perl Question

Printing content of XML in Twig

I am trying to print some basic logs in Perl but I get stuck on a very simple issue: I cannot print the contents of XML tags.

my $twig=XML::Twig->new(pretty_print => "nice");
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";

I tried tthe code above but I receive the error

Can't call method "print" without a package or object reference at line 35, line 15.

Which is this line:

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

I also tried
as is often proposed, but I get the same error. What am I missing here?

Answer Source

This is not jQuery ;--( You have to iterate through the list of descendants.

Plus you can't use print to collect data in a variable, you use print to... print! Use sprint instead:

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

If what you want is the text of the elements, and the contents of all sentence elements is pure text, you could also use $sentence= $root->findvalue( '//sentence')

Also, use $root->att( 'id'), or $root->id since $root->{att}->{id} is not part of the official API, and could potentially change in the future.