use strict; use warnings; use XML::LibXML 2; use XML::LibXML::PrettyPrint; my $xml = XML::LibXML::->load_xml(string => <<'INPUT'); Have a great time at this park! 317851 Playground INPUT my %changes = ( '//response' => sub { $_->setNodeName('Feed') }, '//result' => sub { $_->setNodeName('Products'), %$_ = (); }, '//doc' => sub { $_->setNodeName('Product'), %$_ = (); }, '//str[@name="body"]' => sub { $_->setNodeName('Description'), %$_ = (); }, '//int[@name="is_park_id"]' => sub { $_->setNodeName('ExternalId'), %$_ = (); }, '//str[@name="ss_image_thumb_small"]' => sub { $_->setNodeName('ImageUrl'), %$_ = (); }, '//str[@name="title"]' => sub { $_->setNodeName('Name'), %$_ = (); }, ); while (my ($xpath, $processor) = each %changes) { $xml->findnodes($xpath)->foreach($processor); } print( XML::LibXML::PrettyPrint:: -> new(element => { compact => [qw/ Description ExternalId ImageUrl Name /], }) -> pretty_print($xml) -> toString );