use XML::Parser; my $file = 'customers.xml'; my $parser = new XML::Parser(); my %cities; my $flag = 0; sub start_handler { my $p = shift; my $elem = shift; if ($elem =~ /city/) { $flag = 1; } } sub end_handler { my $p = shift; my $elem = shift; if ($elem =~ /customers/) { foreach $city (keys %{$cities}) { print $city, ": ", %{$cities}->{$city}, "\n"; } } } sub char_handler { if($flag) { my ($p, $data) = @_; $cities->{$data}++; $flag = 0; } } $parser->setHandlers(Start => \&start_handler, End => \&end_handler, Char => \&char_handler); $parser->parsefile($file);