use XML::LibXML::Reader; my $reader = XML::LibXML::Reader->new(string => $html, recover => 2); while ($reader->read) { processNode($reader); } sub processNode { my $reader = shift; printf "%d %d %s %s\n", ($reader->depth, $reader->nodeType, $reader->name, $reader->value); }