2011-10-11 71 views
3

我的XML看起来像这 -如何读取在Perl的libxml节点的值::读者

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

使用XML ::的libxml ::读者,我想打印的时代。

我从here阅读文档,我在寻找一个例子。我能够使用$reader->nextElement('info'),然后打印innerXML,但无法弄清楚如何只打印年龄而不打印整个innerxml

回答

3

尝试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> 

大多来自Regex: keep everything in <profession></profession> tags

+0

谢谢!如果有人可以提出其他选择方案,那将会很棒。我不喜欢使用if语句“过滤” - 如果我可以直接访问该值,它会更优雅 – user837208

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>