【问题标题】:How can I use Perl's XML::LibXML to extract content between tags?如何使用 Perl 的 XML::LibXML 提取标签之间的内容?
【发布时间】:2012-06-05 16:19:00
【问题描述】:

我有一个 XML 文件,其内容如下:

<Node id="7"/>
www
<Node id="10"/>

如何使用 XML::LibXML 和 Perl 来获取两个节点之间的内容,即“www”?

谢谢。

【问题讨论】:

    标签: perl xml-libxml


    【解决方案1】:

    您处理的 XML 格式是糟糕!*

    给定一个节点,您希望节点是它的兄弟节点,紧随其后(可能除了中间 cmets)并且是文本节点。

    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 的子级。例如,&lt;Node id="7"&gt;www&lt;/Node&gt; 会更好。

    【讨论】:

    • 非常感谢您的回复。这很有帮助。解决方案的关键是“nextSibling()”方法。对于 XML 格式,是的,这很糟糕,但我无法将其更改为另一种格式。所以,我必须处理这个。不过没关系,我现在可以从我的 xml 文件中提取我想要的内容了。
    • @user1437832,如果答案符合您的需求,请批准(点击复选标记)以标记您的问题已解决。
    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 2022-01-28
    • 2013-03-04
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2013-07-14
    • 2013-05-23
    相关资源
    最近更新 更多