#! perl use strict; use warnings; use XML::Simple; my $xml = do { local $/; }; my $xmlObj = XML::Simple->new(); my $data = $xmlObj->XMLin($xml, KeyAttr => []); my (@a_out, @ac_out); foreach my $rule ( @{ $data->{rules}{rule} } ) { if ($rule->{name} eq 'A') { push @a_out, $_->{name} for @{ $rule->{nonterminal} }; } elsif ($rule->{name} eq 'AC') { push @ac_out, $_->{name} for @{ $rule->{nonterminal} }; push @ac_out, $_ for @{ $rule->{token} }; } } print join(' ', @a_out ), "\n"; print join(' ', @ac_out), "\n"; __DATA__ 1 10 3 30 var1 var2 % # #### AA AC AD AB AE BE CE 3 30