3

My XML looks like this-

<info>
<name>NameGoesHere</name>
<age>99</age>
</info>

Using XML::LibXML::Reader, I would like to print the age.

I read the documentation from here, and I am looking for an example. I am able to use $reader->nextElement('info') and then print innerXML but not able to figure out how do I print only age and not the whole innerxml.

2 Answers 2

3

Try localName:

#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML::Reader;

my $reader = XML::LibXML::Reader->new(IO => \*DATA)
    or die "Cannot read from \\*DATA\n";

while ( $reader->read ) {
    print $reader->readInnerXml if $reader->localName eq 'age';
}

$reader->finish;

__DATA__
<info>
<name>NameGoesHere</name>
<age>99</age>
</info>

Mostly from Regex: keep everything in <profession></profession> tags

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks! It would be great if someone can suggest any other alternative too. I don't like "filtering" using if statement - it will be more elegant if I can directly access the value
2
use strict;
use warnings;
use feature qw( say );

use XML::LibXML::Reader qw(
   XML_READER_TYPE_ELEMENT
   XML_READER_TYPE_END_ELEMENT
   XML_READER_TYPE_TEXT
);

my $reader = XML::LibXML::Reader->new(IO => \*DATA);

my $in_age = 0;
my $age;
while ($reader->read()) {
   if ($reader->nodeType() == XML_READER_TYPE_ELEMENT && $reader->name() eq 'age') {
      $age = '' if !$in_age;
      ++$in_age;
   }
   elsif ($reader->nodeType() == XML_READER_TYPE_END_ELEMENT && $reader->name() eq 'age') {
      --$in_age;
      say $age if !$in_age;
   }
   elsif ($in_age && $reader->nodeType() == XML_READER_TYPE_TEXT) {
      $age .= $reader->value();
   }
}

__DATA__
<info>
<name>NameGoesHere</name>
<age>99</age>
</info>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.