$|=1; use XML::Rules; use Data::Dumper; $xml = <<'*END*'; <doc> <person> <fname>Jane</fname> <lname>Luser</lname> <email>JLuser@bogus.com</email> <address> <street>Washington st.</street> <city>Old Creek</city> <country>The US</country> <bogus>bleargh</bogus> </address> <phones> <phone type="home">123-456-7890</phone> <phone type="office">663-486-7890</phone> <phone type="fax">663-486-7000</phone> </phones> </person> <person> <fname>John</fname> <lname>Other</lname> <email>JOther@silly.com</email> <address> <street>Grant's st.</street> <city>New Creek</city> <country>Canada</country> <bogus>sdrysdfgtyh degtrhy <foo>degtrhy werthy</foo>werthy drthyu</bogus> </address> <phones> <phone type="office">663-486-7891</phone> </phones> </person> </doc> *END* %rules = ( _default => 'content', '^bogus' => undef, # means "ignore" address => sub {address => "$_[1]->{street}, $_[1]->{city} ($_[1]->{country})"}, person => sub { #print Dumper($_[2], $_[3]); return '@person' => "$_[1]->{lname}, $_[1]->{fname}\n<$_[1]->{email}>\n$_[1]->{address}" }, doc => sub { join "\n\n", @{$_[1]->{person}} }, ); my $parser = new XML::Rules ( rules => \%rules, # other options ); use Data::Dumper; print Dumper($parser); print "About to parse\n"; my $result = $parser->parsestring($xml); print "Result:\n$result\n";