use strict; use XML::Rules; sub do_something_with { print join(', ', @_), "\n"; } my $parser = XML::Rules->new( rules => { _default => 'content', asset => 'as array no content', account => sub { my ($tag, $attr) = @_; foreach my $asset (@{$attr->{asset}}) { do_something_with($attr->{accountId}, $attr->{accountName}, $asset->{assetId}, $asset->{assetName}); } }, } ); $parser->parse(\*DATA); __DATA__ 001 Account 001 abcd Asset abcd ...