use XML::LibXML; my $dom = XML::LibXML->load_xml(IO => \*DATA); foreach my $level ($dom->findnodes('//level | //levels')) { printf("==== level '%s' ====\n", $level->getAttribute('name')); foreach my $child ($level->getChildrenByTagName('*')) { printf("contains %s '%s'\n", $child->nodeName, $child->getAttribute('name')); } print "\n"; } __DATA__