A0a0Activeactive... A1a1Activeactive... #### #!/usr/bin/perl -w use strict; use warnings; use XML::Rules; my %data; my @rules = ( my $id; #$id will be the _content of DISPLAY after the Property Name my $var; #$var will be the _content of DISPLAY PROPERTY => sub { if ($_[1]{NAME} eq "id"){ $data{$id} = {}; } else ($data{$id} = {$_[1]{NAME} => $var}) } }, DISPLAY => sub {#some code to initialize $var}; my $xr = XML::Rules->new( rules => \@rules, stripspaces => 2 ); $xr->parse(); #### #!/usr/bin/perl -w use strict; use warnings; use vars qw/ %options /; use Getopt::Std; use XML::Rules; use Data::Dumper; #..... # Code to treat file #..... my %data; my $temp; my $id; my $trigger = 0; my @rules = ( PROPERTY => sub { if ($_[1]{NAME} eq "id"){ $data{$id} = {}; #Creates empty hash using the id as the key $trigger = 1; } elsif ($_[1]{NAME} eq "class"){ #class is the last tag before the new line $data{$id} -> {@{$_[1]}{NAME}} = $temp; $trigger = 0; #this resets the trigger to let the script know that the next property is } #going to be the id else { $data{$id} -> {@{$_[1]}{NAME}} = $temp; } }, DISPLAY => sub { if ($trigger == 0){ $id = @{$_[1]}{_content}; } else { $temp = @{$_[1]}{_content}; } }, ); my $xr = XML::Rules->new( rules => \@rules, stripspaces => 2 ); $xr->parsefile($File); print Dumper(\%data);