2011-10-11 18 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>