#!/usr/bin/perl use warnings; use strict; use XML::LibXML::Reader; use Data::Dumper; sub process_record { my ($node, $records) = @_; my $name = $node->findvalue('@name'); my $citype = $node->findvalue('@ciType'); my $status = $node->findvalue('dimension/@status'); my $time = $node->findvalue('normalize-space(dimension/body/entry[@key="Last Status Change"])'); push @$records, { name => $name, citype => $citype, status => $status, Time => $time }; } my $bamxml = 'file.xml'; my @records; my $pattern = 'XML::LibXML::Pattern' ->new('/nodes/node/children/node/children/node'); my $reader = 'XML::LibXML::Reader'->new(location => $bamxml); while ($reader->nextPatternMatch($pattern) and $reader->nodeType == XML_READER_TYPE_ELEMENT) { next unless $reader->getAttribute('ciType') eq 'application'; my $node = $reader->copyCurrentNode(1); process_record($node, \@records); } print Dumper \@records;