2012-01-10 95 views
3

您好我有如下一个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

回答

0

这是非常简单的:

#!/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 
+0

感谢flesk。你的帖子对我总是有帮助的。 – user1019072 2012-01-11 20:45:48