Foo #### my $parser = XML::LibXML->new(); my $data = $parser->parse_string ( $xml ); $data->setNamespace ( 'urn:foo', 'x' ); for my $first_sub ( $data->findnodes ('/x:root/x:first_sub')) { my $name = $first_sub->getAttribute('name'); $first_sub->setNamespace ('urn:foo','x'); for my $second_sub ( $first_sub->findnodes ('./x:second_sub')) { my $id = $second_sub->getAttribute('id'); $second_sub->setNamespace ('urn:foo','x'); for my $third_sub ( $second_sub->findnodes('./x:third_sub')) { # do something with the values } } }