use strict; use XML::Parser; # Set up the XML parser to point to standard symdev processing subroutines my $parser = XML::Parser->new( Handlers => { Start => \&symdev_start, End => \&symdev_end, Final => \&symdev_final, Char => \&symdev_char, } ); open my $symdev_list, '935.xml'; $parser->parse($symdev_list); close $symdev_list; { my ( $dev, $text ); my @element_stack; my %conf_of; sub symdev_start { my ( $expat, $name, %atts ) = @_; push @element_stack, $name; $text = ''; } sub symdev_end { my ( $expat, $name, %atts ) = @_; pop @element_stack; if ( $name eq 'dev_name' ) { $dev = $text; } elsif ( $name eq 'configuration' ) { $conf_of{$dev} = $text; } } sub symdev_char { my ( $expat, $string ) = @_; $text .= $string; } sub symdev_final { my ( $expat, $name, %atts ) = @_; for my $key ( keys %conf_of ) { print "$key\t$conf_of{$key}\n"; } } }