perl xml :: sax - PullRequest
       9

perl xml :: sax

3 голосов
/ 10 января 2012

Привет, у меня есть xml, как показано ниже:

<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 и символов. Я должен справиться с двумя сценариями, которые я не уверен, как справиться. 1) если joinDate равен нулю, тогда joinDate принимается за sysdate. 2) суммируйте сумму и получите значение totalAmount. Как это сделать с помощью модуля XML :: SAX в perl.

Подскажите, какой метод мне нужно переопределить, чтобы сделать это, и небольшой фрагмент кода поможет.

Спасибо, Srikanth

1 Ответ

0 голосов
/ 11 января 2012

Это довольно просто:

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...