Perl:接收 XPath 元素的多个子元素

Perl: Receive multiple children of XPath element

我正在使用 XML::Twig 解析 XML 文件并打印一些信息。这是我的 XML 文件:

<report>
    <reportheader>
        <month>February 2015</month>
        <dateofgeneration>20/02/2015 - 12:29:02</dateofgeneration>
    </reportheader>
</report>

我有以下代码:

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

不幸的是,这会打印 February 201520/02/2015 - 12:29:02。有没有办法将这两者分开而不是将它们连接起来?我希望做这样的事情:

printf qq|Month: %s\nDate: %s\n|, $_->text[0], $_->text[1];

将其分成两个变量,但这没有用。

我打算现在写一个 that showed how it may be simpler to avoid the callback system of XML::Twig altogether for anything other than huge XML data files. I have added 的答案,你不妨看看。

同样的方法也适用于这个问题。只需找到所有 /report/reportheader 元素,然后打印它们(第一个)monthdateofgeneration 子元素的文本内容即可。

这是一个工作示例。请注意,它假设这两个子元素 始终 存在。如果您的实际数据不是这样,那么您可能需要先测试它们的存在,但请注意 first_child_trimmed_text (及其兄弟)将只是 return 如果指定节点没有投诉的空字符串不存在。

use strict;
use warnings;
use 5.010;     # For `say`

use XML::Twig;

my $twig = XML::Twig->new;
$twig->parsefile(shift @ARGV);

for my $report_header ( $twig->findnodes('/report/reportheader') ) {
  say $report_header->first_child_trimmed_text('month');
  say $report_header->first_child_trimmed_text('dateofgeneration');
}

输出

February 2015
20/02/2015 - 12:29:02