Я новичок в объекте 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 () не работает, потому что узел первого уровня может не иметь детей (заголовок, нижний колонтитул). На данный момент мой код выглядит так:
$dom = new DOMDocument(); $dom -> preserveWhiteSpace = false; $dom -> loadHTML($html); $childs = $dom -> getElementsByTagName('div');
Но это дает мне все дивы. любой совет?
Возможно, вам придется выйти за пределы DOMDocument – возможно, конвертировать в SimpleXML или DOMXpath
$file = $DOCUMENT_ROOT. "test.html"; $doc = new DOMDocument(); $doc->loadHTMLFile($file); $xpath = new DOMXpath($doc); $elements = $xpath->query("/");
Вот как я захватываю элементы первого уровня (в этом случае элементы 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; }