use strict; use warnings; use XML::Simple; use Data::Dumper; local $/; # slurp my $data = XMLin(, KeyAttr => [], ForceArray => [qw/substrate product/]); for my $reaction (@{$data->{reaction}}) { print $reaction->{name}, ' (', $reaction->{type}, "):\n"; for my $substrate (@{$reaction->{substrate}}) { foreach my $product (@{$reaction->{product}}) { print "\t", $substrate->{name}, " -- ", $product->{name}, "\n"; } } } __DATA__