information info 1 info 2 data 4 info info #### use strict; use XML::SAX; my $parser = XML::SAX::ParserFactory->parser( Handler => symdevHandler->new ); open my $symdev_list, '935.xml'; $parser->parse_file($symdev_list); close $symdev_list; package symdevHandler; use base qw(XML::SAX::Base); my ( $dev ); my @element_stack; my %conf_of; sub start_element { my ($self, $el) = @_; push @element_stack, $el->{Name}; } sub end_element { my ($self, $el) = @_; pop @element_stack; } sub characters { my ($self, $el) = @_; my $text = $el->{Data}; my $in_element = $element_stack[-1]; if ( $in_element eq 'dev_name' ) { $dev = $text; } elsif ( $in_element eq 'configuration' ) { $conf_of{$dev} = $text; } } sub end_document { my ($self, $el) = @_; for my $key ( keys %conf_of ) { print "$key\t$conf_of{$key}\n"; } } 1; #### 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"; } } } #### use strict; use warnings; use XML::Rules; open my $symdev_list, '935.xml'; my @rules = ( dev_name => sub{ my $dev = $_[1]->{_content} }, ); my $parser = XML::Rules->new(rules => \@rules); $parser->parse( $symdev_list); close $symdev_list;