Использование стека для записи того, в каких узлах вы находитесь, push
при каждом входе в узел и pop
при каждом выходе из узла:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use XML::SAX::ParserFactory;
use XML::SAX::PurePerl;
my (@nodes, $characters, @names);
my $factory = new XML::SAX::ParserFactory;
my $handler = new XML::SAX::PurePerl;
my $parser = $factory->parser(
Handler => $handler,
Methods => {
start_element => sub {
push @nodes, shift->{LocalName};
},
characters => sub {
$characters = shift->{Data};
},
end_element => sub {
if (shift->{LocalName} eq 'name' && $nodes[-2] eq 'company') {
push @names, $characters;
}
pop @nodes;
}
}
);
$parser->parse_uri("sample2.xml");
print Dumper \@names;
Вывод:
$VAR1 = [
' abc ',
' xyz '
];
$nodes[-2]
является вторым по последнему элементу в @nodes
и преобразуется в 'employee' или 'company', когда shift->{LocalName}
равно 'name'