use XML::Simple; my $XML_string=<<'XML'; XML # create object my $xmlfile = XML::Simple->new(KeyAttr => {result => 'result'} ); my $xml = $xmlfile->XMLin($XML_string); my $Passed = 0; my $Warnings = 0; my $Failed = 0; print Dump $XML; foreach my $TCresult (@{$xml->{dut}{tc}}){ print Dump $TCresult; if ($TCresult->{result} eq 'Passed'){$Passed++;} if ($TCresult->{result} eq 'Warnings'){$Warnings++;} if ($TCresult->{result} eq 'Failed'){$Failed++;} } print "Passed: $Passed\n"; print "Warnings: $Warnings\n"; print "Failed: $Failed\n"; #### --- dut: tc: - id: 001.001 result: Passed ts: {} - id: 002.001 result: Failed ts: {} - id: 003.001 result: Warnings ts: {} #### $VAR1 = [ { 'dut' => { 'tc' => { '002.001' => { 'ts' => {}, 'result' => 'Failed' }, '001.001' => { 'ts' => {}, 'result' => 'Passed' }, '003.001' => { 'ts' => {}, 'result' => 'Warnings' } } } } ];