2012-06-05 49 views

回答

2

,你必须处理XML格式是可怕!*

给出一个节点,你希望那是它的兄弟姐妹节点,紧跟它(除非是中介评论)和是文本节点。

use strict; 
use warnings; 
use feature qw(say); 

use XML::LibXML qw(XML_COMMENT_NODE XML_TEXT_NODE); 

sub following_text { 
    my ($node) = @_; 
    my $text = ''; 
    while ($node = $node->nextSibling()) { 
     my $node_type = $node->nodeType(); 
     next if $node_type == XML_COMMENT_NODE; 
     last if $node_type != XML_TEXT_NODE; 
     $text .= $node->data(); 
    } 

    return $text; 
} 

my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_fh(\*DATA); 
my $root = $doc->documentElement(); 
my ($node) = $root->findnodes('//Node[@id="7"]'); 
my $text = following_text($node); 

say $text; 

__DATA__ 
<root> 
<Node id="7"/> 
www 
<Node id="10"/> 
bar 
</root> 

* — www应该是Node一个孩子。例如,<Node id="7">www</Node>会更好。

+0

@ user1437832,修正了一个错误。 – ikegami

+0

Thans很多为您的答复。这非常有帮助。解决方案的关键是“nextSibling()”方法。对于XML格式,是的,这很糟糕,但我无法将其更改为另一种格式。所以,我必须处理这个问题。但没关系,我现在可以从我的xml文件中提取我想要的内容。 – user1437832

+0

@ user1437832,如果答案符合您的需求,请批准它(单击复选标记)以标记您的问题已解决。 – ikegami

相关问题