如何使用PHP DOMDocument获取第一级节点?

时间:2009-10-08 20:40:00

标签: php dom

我是PHP DOM对象的新手,遇到问题我无法找到解决方案。我有一个带有以下HTML的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。有什么建议吗?

2 个答案:

答案 0 :(得分:7)

您可能必须转到DOMDocument之外 - 可能转换为SimpleXML或DOMXpath

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

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

答案 1 :(得分: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 );

$ arr现在包含顶部的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; 
}