use XML::Twig; my $twig= new XML::Twig( start_tag_handlers => { 'level' => \&start_level }, twig_handlers => { 'level' => \&end_level }, ); $twig->parsefile($file); my @levels; sub start_level { push @levels, $_[1]->{att}{label}; print join ('.', @levels), "\n" if @levels == 3 } sub end_level { pop @levels; }