2009-10-08 5 views
1

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

<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'); 

Но это заставляет меня все DIV-х. любой совет?

ответ

7

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

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

$xpath = new DOMXpath($doc); 
$elements = $xpath->query("/"); 
+0

Спасибо, что помогли. –

1

Вот как я хватаю первые элементы уровня (в данном случае, верхний уровень 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); 

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

$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; 
} 
Смежные вопросы