Как получить узлы на первом уровне, используя PHP DOMDocument? - PullRequest
1 голос
/ 09 октября 2009

Я новичок в объекте PHP DOM, и у меня возникла проблема, я не могу найти решение. У меня есть DOMDocument со следующим HTML:

<div id="header">
</div>
<div id="content">
    <div id="sidebar">
    </div>
    <div id="info">
    </div>
</div>
<div id="footer">
</div>

Мне нужно получить все узлы первого уровня (заголовок, контент, нижний колонтитул). hasChildNodes () не работает, потому что узел первого уровня может не иметь дочерних элементов (header, Footer). На данный момент мой код выглядит так:

$dom = new DOMDocument();
$dom -> preserveWhiteSpace = false;
$dom -> loadHTML($html);
$childs = $dom -> getElementsByTagName('div');

Но это дает мне все дивы. любой совет?

Ответы [ 2 ]

7 голосов
/ 09 октября 2009

Возможно, вам придется выйти за пределы DOMDocument - возможно, конвертировать в SimpleXML или DOMXpath

$file = $DOCUMENT_ROOT. "test.html";
$doc = new DOMDocument();
$doc->loadHTMLFile($file);

$xpath = new DOMXpath($doc);
$elements = $xpath->query("/");
1 голос
/ 02 июля 2010

Вот как я получаю элементы первого уровня (в данном случае TD-элементы верхнего уровня в строке таблицы:

$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->loadHTML( $tr_element );

$xpath = new DOMXPath( $doc );
$td = $xpath->query("//tr/td[1]")->item(0);

do{
   if( $innerHTML = self::DOMinnerHTML( $td ) )
     array_push( $arr, $innerHTML );
   $td = $td->nextSibling;
} while( $td != null );

$ arr теперь содержит верхние элементы TD, а не вложенные таблицы TD, которые вы получите от

$dom->getElementsByTagName( 'td' );

Функция DOMinnerHTML - это то, что я где-то зацепил, чтобы получить innerHTML элемента / узла:

public static function DOMinnerHTML( $element, $deep=true ) 
{ 
  $innerHTML = ""; 
  $children = $element->childNodes; 
  foreach ($children as $child) 
  { 
    $tmp_dom = new DOMDocument(); 
    $tmp_dom->appendChild( $tmp_dom->importNode( $child, $deep ) ); 
    $innerHTML.=trim($tmp_dom->saveHTML()); 
  } 
  return $innerHTML; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...