我有一个包含多个标签的XML文件,我想计算某些标签之间的年份,比如
<Dateline>08/Dec./2009</Dateline>
我只想得到多少2009年和2010年等等当天和月份并不重要,我想要这样的
2012&gt;&gt; 20
尝试用perl工作,但没有运气。 也可以在这些标签之间打印什么,无论外部文件中的日期或文字是什么。
示例XML:
<Sabanews>
<ID>SBN_ARB_0000001</ID>
<Start URL>sabanews.net/ar/news200024.htm</Start URL>
<Headline>الكونجرس الأمريكي يطالب المجتمع الدولي دعم اليمن لمواجهة التحديات القائمة</Headline>
<Dateline>08/ديسمبر/2009</Dateline>
<Text> واشنطن ـ سبأنت: طالب الكون المزعزعة للاستقرار والعو اليمنيين خصوصا أن يعملوا معا لمجابهة التحديات القائمة". سبأ</Text>
</Sabanews>
答案 0 :(得分:1)
这是一种简化,因为您的规范含糊不清。把它固定一点,我可以澄清/扩展。视为可以采取的方法的一个例子。
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my %count_of;
sub extract_date {
my ( $twig, $dateline ) = @_;
my $date_string = $dateline->text;
print $date_string,"\n";
my ($year) = ( $date_string =~ m#/(\d+)$# );
$count_of{$year}++;
}
my $parser = XML::Twig->new( twig_roots => { 'Dateline' => \&extract_date } );
#probably want parsefile here in your real world code.
$parser->parse( \*DATA );
foreach my $date ( sort keys %count_of ) {
print $date, " >> ", $count_of{$date}, "\n";
}
__DATA__
<XML>
<Dateline>01/Dec./2009</Dateline>
<Dateline>02/Dec./2009</Dateline>
<Dateline>03/Dec./2020</Dateline>
<Dateline>04/Dec./2015</Dateline>
<Dateline>05/Dec./2015</Dateline>
</XML>
我们设置了一个处理程序,每次我们看到“日期线”时都会触发该处理程序。元素,并忽略其他任何东西。
此处理程序从元素中提取文本,使用正则表达式提取年份,然后将其添加到%count_of
。我们之后打印。
给出:
01/Dec./2009
02/Dec./2009
03/Dec./2020
04/Dec./2015
05/Dec./2015
2009 >> 2
2015 >> 2
2020 >> 1
编辑:鉴于新的XML示例 - 您需要与上述略有不同的内容。该方法应该仍然有用。
谷歌翻译告诉我ديسمبر
是&#34; 12月&#34;所以它&#39;还是个约会。您可能会发现使用Time::Piece
正确解析它应该支持区域设置。
否则你需要提取你的年份&#39;用:
my ($year) = ( $date_string =~ m#^\d+/(\d+)/\w+$# );
编辑:处理&#39;命令行&#39;文件名规范:
my ( $filename ) = @ARGV;
$parser -> parsefile ( $filename );
这可让您运行xmlparse.pl <filename>
。