#!/usr/bin/perl
use strict;
use warnings;
no warnings qw(uninitialized);
use XML::Rules;
my $xml = <<'XML';
<all>
<doc>
<date name="processingtime">2011-04-09T11:12:22.049Z</date>
<str name="docuid">121422</str>
<str name="title">ABC</str>
</doc>
<doc>
<date name="processingtime">2012-04-09T11:12:22.049Z</date>
<str name="docuid">13427</str>
<str name="title">CDE</str>
</doc>
<doc>
<date name="processingtime">2010-04-09T11:12:22.049Z</date>
<str name="docuid">89822</str>
<str name="title">LKK</str>
</doc>
</all>
XML
my @rules = (
'str' => sub {
return unless $_[1]->{name} eq 'docuid';
my $id = $_[1]->{_content};
$_[4]->{pad} = $id if ($id > $_[4]->{pad});
return;
},
'all' => sub { return $_[4]->{pad}; }
);
my $parser = XML::Rules->new(rules => \@rules);
my $max_value = $parser->parse( $xml );
print "The max value is: $max_value\n";
This assumes that you want the maximal value from any <str> tag with attribute name="docuid" as it doesn't check the "path" to the <str> tag!
Update: With version 1.16 and later it's easy to give the specific parser a more readable interface:
use XML::Rules max_docuid => {
method => 'parse',
rules => {
'str' => sub {
return unless $_[1]->{name} eq 'docuid';
my $id = $_[1]->{_content};
$_[4]->{pad} = $id if ($id > $_[4]->{pad});
return;
},
'all' => sub { return $_[4]->{pad}; }
}
};
#...
print "The max value is: " . max_docuid($xml) . "\n";
Jenda
Enoch was right!
Enjoy the last years of Rome.
|