use strict; use warnings; use XML::Rules; use Data::Dumper qw(Dumper); my $xml = < XML my @rules = ( "^object" => sub { $_[1]{type} eq 'Dog' }, object => sub { print join("|", @{$_[1]}{qw(name dog_breed_id dog_breed_name)}),"\n"; return; }, property => sub {$_[1]->{name} => $_[1]->{value}}, ); my $xr = XML::Rules->new( rules => \@rules, stripspaces => 2 ); $xr->parse($xml);