我正在使用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];
将它分成两个变量但不起作用。
答案 0 :(得分:3)
我打算写一个your previous question的答案,它表明除了巨大的XML数据文件之外,完全避免XML::Twig
的回调系统可能更简单。我现在添加了that answer,你可能想看看。
同样的方法也适用于这个问题。只需查找所有/report/reportheader
元素,并打印其(第一个)month
和dateofgeneration
子元素的文本内容即可。
这是一个有效的例子。请注意,它假定两个子元素始终存在。如果您的实际数据不是真的,那么您可能需要先测试它们的存在,但请注意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