XML::Parser
examples/xml/xml_parser_tree_process.pl
#!/usr/bin/perl use strict; use warnings; use XML::Parser; my $parser = XML::Parser->new(Style => 'Tree'); my $tree = $parser->parsefile('examples/data.xml'); # List all the currencies foreach my $country (get_tag_subtrees($tree->[1], 'country')) { my ($name_tree) = get_tag_subtrees($country, 'name'); my $name = $name_tree->[2]; foreach my $currency (get_tag_subtrees($country, 'currency')) { printf "%-10s %s\n", $name, $currency->[2]; } } # get a country with a given name foreach my $country (get_tag_subtrees($tree->[1], 'country')) { my ($name_tree) = get_tag_subtrees($country, 'name'); next if $name_tree->[2] ne 'USA'; foreach my $currency (get_tag_subtrees($country, 'currency')) { printf "The currency in the USA is %s.\n", $currency->[2]; } } foreach my $country (get_tag_subtrees($tree->[1], 'country')) { next if $country->[0]{id} ne '2'; foreach my $currency (get_tag_subtrees($country, 'currency')) { printf "The currency in the country with id 2 is %s.\n", $currency->[2]; } } sub get_tag_subtrees { my ($tree, $name) = @_; my @subtrees; foreach my $i (1.. (@{ $tree }-1) / 2) { if ($tree->[2*$i-1] eq $name) { push @subtrees, $tree->[2*$i]; } } return @subtrees; }