use XML::Rules; my $parser = XML::Rules->new( namespaces => { 'http://alexa.amazonaws.com/doc/2005-10-05/' => '', 'http://awis.amazonaws.com/doc/2005-07-11' => '', }, rules => [ 'DataUrl,Asin,Rank,RequestId,StatusCode' => 'content', 'TrafficData,Alexa,UrlInfoResult,OperationRequest,ResponseStatus' => 'no content', 'Response' => sub { print <<"*END*" Do something with request $_[1]->{OperationRequest}{RequestId}, it was a $_[1]->{ResponseStatus}{StatusCode} URL: $_[1]->{UrlInfoResult}{Alexa}{TrafficData}{DataUrl} Rank: $_[1]->{UrlInfoResult}{Alexa}{TrafficData}{Rank} *END* return; } ], ); # or, if you want to simplify the data as you parse them: my $parser = XML::Rules->new( namespaces => { 'http://alexa.amazonaws.com/doc/2005-10-05/' => '', 'http://awis.amazonaws.com/doc/2005-07-11' => '', }, rules => [ 'DataUrl,Asin,Rank,RequestId,StatusCode' => 'content', 'UrlInfoResult,OperationRequest' => 'no content', 'TrafficData,Alexa' => 'pass no content', 'ResponseStatus' => sub { return 'ResponseStatus' => $_[1]->{StatusCode}}, 'Response' => sub { print <<"*END*" Do something with request $_[1]->{OperationRequest}{RequestId}, it was a $_[1]->{ResponseStatus} URL: $_[1]->{UrlInfoResult}{DataUrl} Rank: $_[1]->{UrlInfoResult}{Rank} *END* return; } ], );