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
元素,然后打印它们(第一个)month
和 dateofgeneration
子元素的文本内容即可。
这是一个工作示例。请注意,它假设这两个子元素 始终 存在。如果您的实际数据不是这样,那么您可能需要先测试它们的存在,但请注意 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
我正在使用 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];
将其分成两个变量,但这没有用。
我打算现在写一个XML::Twig
altogether for anything other than huge XML data files. I have added
同样的方法也适用于这个问题。只需找到所有 /report/reportheader
元素,然后打印它们(第一个)month
和 dateofgeneration
子元素的文本内容即可。
这是一个工作示例。请注意,它假设这两个子元素 始终 存在。如果您的实际数据不是这样,那么您可能需要先测试它们的存在,但请注意 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