计算两个标签之间的实例

时间:2015-03-27 16:07:11

标签: xml perl

我有一个包含多个标签的XML文件,我想计算某些标签之间的年份,比如

    <Dateline>08/Dec./2009</Dateline>

我只想得到多少2009年和2010年等等当天和月份并不重要,我想要这样的

  • 2008&gt;&gt; 10
  • 2009&gt;&gt; 11
  • 2010&gt;&gt; 12
  • 2011&gt;&gt; 15
  • 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>

1 个答案:

答案 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>