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

时间:2015-03-05 18:05:13

标签: xml perl xpath xml-twig

我正在使用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];

将它分成两个变量但不起作用。

1 个答案:

答案 0 :(得分:3)

我打算写一个your previous question的答案,它表明除了巨大的XML数据文件之外,完全避免XML::Twig的回调系统可能更简单。我现在添加了that answer,你可能想看看。

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

这是一个有效的例子。请注意,它假定两个子元素始终存在。如果您的实际数据不是真的,那么您可能需要先测试它们的存在,但请注意first_child_trimmed_text(及其兄弟)只返回一个空字符串,如果指定的节点没有&# 39; t存在。

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