use 5.010; use Data::Dumper; use XML::LibXML 1.70; my $xml = XML::LibXML->load_xml(IO => \*DATA); my @results; foreach my $dict ($xml->findnodes('//dict')) { my $key = $dict->getAttribute('key'); next unless $key ~~ [qw( subnet gateway cidr netmask )]; push @results, {} if $key eq 'subnet'; my $value = $dict->findvalue('.//value'); $results[-1]{ $key } = "$value"; } print Dumper \@results; __DATA__ success 10.11.14.0 10.11.13.1 10.11.14.0/21 255.255.248.0 10.11.15.0 10.11.13.1 10.11.15.0/24 255.255.255.0 10.15.8.0 10.11.13.1 10.15.8.0/22 255.255.252.0 10.7.17.22 10.11.13.1 10.7.17.224/28 255.255.255.240 10.11.24.0 10.11.13.1 10.11.24.0/24 255.255.255.0 0