gpt4 book ai didi

perl xml::sax 解析

转载 作者:行者123 更新时间:2023-12-04 23:56:59 26 4
gpt4 key购买 nike

您好,我有一个 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 为 null,则将 joinDate 作为 sysdate。 2) 将金额相加并得到一个值作为 totalAmount。如何在 perl 中使用 XML::SAX 模块来做到这一点。

请告诉我我需要覆盖哪个方法才能执行此操作,一小段代码会有所帮助。

谢谢,斯里坎特

最佳答案

这很简单:

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

关于perl xml::sax 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8809301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com