O PHP limitou o tamanho da pilha quando se trata de recursão. Por causa dessa análise recursiva de DOM pode não ser adequada (você terá que aumentar o tamanho da pilha). Usar o algoritmo de remoção da fila, no entanto, é rápido e fácil:
// $xml is an instance of DOMDocument
// replace with 'body' if you don't need the header tags
$node = $xml->getElementsByTagName('html')->item(0);
$level = 0;
$nodes = array($level => array($node));
do {
while (!empty($nodes[$level])) {
$node = array_shift($nodes[$level]); // FIFO
// do whatherver you like with the node
...
if ($node->childNodes && $node->childNodes->length) {
$level++;
$nodes[$level] = array();
foreach ($node->childNodes as $childNode) {
array_push($nodes[$level], $childNode);
}
}
}
$level--;
} while ($level > 0);