Como obter o primeiro nível de elementos dom pelo Domdocument PHP?

Como obter o primeiro nível de elementos dom pelo Domdocument PHP?

Exemplo com código que não funciona – retirado de Q & A: http: //stackoverflow.com/questions/1540302/how-to-get-nodes-in-first-level-using-phpdomdocument

<?php $str=<<< EOD  
EOD; $doc = new DOMDocument(); $doc->loadHTML($str); $xpath = new DOMXpath($doc); $entries = $xpath->query("/"); foreach ($entries as $entry) { var_dump($entry->firstChild->nodeValue); } ?>

Obrigado, Yosef

O primeiro nível de elementos abaixo do nó raiz pode ser acessado com

 $dom->documentElement->childNodes 

A propriedade childNodes contém um DOMNodeList , que você pode iterar com foreach .

Veja DOMDocument::documentElement

Este é um atributo de conveniência que permite o access direto ao nó filho que é o documento elemento do documento.

e DOMNode::childNodes

Um DOMNodeList que contém todas as crianças desse nó. Se não houver filhos, este é um DOMNodeList vazio.

Uma vez que childNodes é uma propriedade do DOMNode qualquer class que se estende DOMNode (que é a maioria das classs em DOM) tem essa propriedade, então, para obter o primeiro nível de elementos abaixo, um DOMElement é acessar a propriedade childNode do DOMElement.


Observe que, se você usar DOMDocument::loadHTML() em HTML ou documentos parciais inválidos, o módulo do analisador HTML irá adicionar um esqueleto HTML com html e tags corporais, então na tree DOM, o HTML no seu exemplo será

   

que você deve ter em consideração ao percorrer ou usar o XPath. Consequentemente, usando

 $dom = new DOMDocument; $dom->loadHTML($str); foreach ($dom->documentElement->childNodes as $node) { echo $node->nodeName; // body } 

só irá iterar o nó DOMElement. Sabendo que libxml irá adicionar o esqueleto, você terá que iterar sobre os Nodos do elemento para obter os elementos div do seu código de exemplo, por exemplo

 $dom->getElementsByTagName('body')->item(0)->childNodes 

No entanto, fazê-lo também levará em consideração todos os nós de espaço em branco, então você deve ter certeza de configurar preserveWhiteSpace para falso ou consultar o elemento direito do elemento nodeType se você quiser apenas obter os nós do DOMElement , por exemplo

 foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $node) { if ($node->nodeType === XML_ELEMENT_NODE) { echo $node->nodeName; } } 

ou use o XPath

 $dom->loadHTML($str); $xpath = new DOMXPath($dom); foreach ($xpath->query('/html/body/*') as $node) { echo $node->nodeName; } 

Informação adicional:

  • DOMDocument in php
  • Impressão de conteúdo de um arquivo XML usando XML DOM