А зачем рекурсия?
Вот, писал когда-то чрезвычайно полезную функцию.

Код:
function nextNode(node_xml:XMLNode):XMLNode {
if (node_xml.hasChildNodes() == true) return (node_xml.firstChild);
else while (node_xml.nextSibling == null && node_xml.parentNode != null) node_xml = node_xml.parentNode;
return (node_xml.nextSibling);
}
А обойти всё дерево можно так

Код:
xmlDoc = new XML("<A><C/></A><B/>")
xm = xmlDoc.firstChild
i = 0
while(xm!= null && xm != undefined)
{
i+=1
trace('нод № '+i)
trace(xm)
xm = nextNode(xm)
}
Позволяет просто перебрать все подряд ноды в дереве. Можно сделать перебор внутри одного нода, если поставить другие условия в while