my $parser = XML::Rules->new( rules => { _default => 'content', category => 'content array', entry => sub { my ($tag,$attr) = @_; delete $attr->{_content}; $attr->{type} = shift(@{$attr->{category}}); return '@entry' => $attr; }, post => 'pass no content', } ); my $data = $parser->parse($the_xml); foreach my $entry (@$data) { print "Title: $entry->{title}\nContent: $entry->{content}\n"; if ($entry->{type) eq 'blog') { print "It's a blog post with labels: ".join(', ', @{$entry->{category}})."\n\n"; } ...