我是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。有什么建议吗?
答案 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;
}