Perl的XML :: SAX解析
问题描述:
您好我有如下一个xml:Perl的XML :: SAX解析
<employees>
<employee>
<firstname>John</firstname>
<lastname>Doe</lastname>
<age>gg</age>
<department>Operations</department>
<amount Ccy="EUR">100</amount>
<joinDate> 12/12/2011 </joinDate>
</employee>
<employee>
<firstname>John1111</firstname>
<lastname>Doe1111</lastname>
<age>gg</age>
<department>Operations</department>
<amount Ccy="EUR">200</amount>
<joinDate> 12/13/2011 </joinDate>
</employee>
</employees>
我想这解析XML使用SAX ::。所以我重写了start_element和end_element和characters方法。我必须处理两个场景,我不知道如何处理。 1)如果joinDate为null,则将joinDate作为sysdate。 2)总结金额并获得一个值作为totalAmount。如何在perl中使用XML :: SAX模块来做到这一点。
抛出一些光我需要重写的方法来做到这一点,一小段代码将帮助。
感谢, SRIKANTH
答
这是非常简单的:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use XML::SAX::ParserFactory;
use XML::SAX::PurePerl;
use Date::Calc 'Today';
my $today = sprintf("%02d/%02d/%4d", (Today())[1,2,0]);
# Alternatively if you can't use Date::Calc:
# my @localtime = localtime;
# my $today = sprintf("%02d/%02d/%4d", $localtime[4]+1, $localtime[2], $localtime[5]+1900);
my (@joindates, $total_amount, $buffer);
my $factory = new XML::SAX::ParserFactory;
my $handler = new XML::SAX::PurePerl;
my $parser = $factory->parser(
Handler => $handler,
Methods => {
characters => sub {
$buffer = shift->{Data};
$buffer =~ s/^\s+|\s+$//g;
},
end_element => sub {
return unless shift->{LocalName} =~ /^(amount|joinDate)$/;
push @joindates, $buffer || $today if $1 eq 'joinDate';
$total_amount += $buffer if $1 eq 'amount';
}
}
);
$parser->parse_uri("sample.xml");
print "Total amount: $total_amount\n";
printf("Join dates:\n%s\n", join("\n", @joindates));
输出:
Total amount: 300
Join dates:
12/12/2011
12/13/2012
感谢flesk。你的帖子对我总是有帮助的。 – user1019072 2012-01-11 20:45:48