【问题标题】:Perl: Extract element from XML::TwigPerl:从 XML::Twig 中提取元素
【发布时间】:2015-03-06 02:18:20
【问题描述】:

如何使用 XML::Twig 从 XML 文档中提取单个元素?

XML 代码:

<report>
    <reportheader>
        <month>February 2015</month>
    </reportheader>
</report>

我的尝试

XML::Twig->new(
    twig_handlers => {
        '/report/reportheader/month' => sub {
            printf qq|%s\n|, $_;
        },
    },  
)->parsefile($ARGV[0]);

但这只是输出XML::Twig::Elt=HASH(0x343af70)。我错过了什么?

【问题讨论】:

    标签: xml perl


    【解决方案1】:

    这是因为在匿名子程序中,$_ 是元素对象。如果要打印元素的文本,请使用:

    printf qq|%s\n|, $_->text_only;
    

    产生:

    February 2015
    

    或者如果您想打印整个元素,请改用:

    printf qq|%s\n|, $_->outer_xml;
    

    产生:

    <month>February 2015</month>
    

    您可以查看文档,它们非常清楚。

    【讨论】:

      【解决方案2】:

      虽然使用XML::Twig 的回调系统很诱人,但通常更简单的是简单地将整个 XML 数据解析为 'XML::Twig' 数据结构并使用findnodes 等访问其中的内容.

      这是一个打印与 XPath 表达式 /report/reportheader/month 匹配的所有元素的文本内容的示例。

      use strict;
      use warnings;
      use 5.010;     # For `say`
      
      use XML::Twig;
      
      my $twig = XML::Twig->new;
      $twig->parsefile(shift @ARGV);
      
      for my $report_month ( $twig->findnodes('/report/reportheader/month') ) {
        say $report_month->trimmed_text;
      }
      

      输出

      February 2015
      

      【讨论】:

      • 同意。回调非常适合提取和清除类型的操作,但很快就会变得混乱和混乱,否则没有真正的好处。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多