我正在尝试使用DOMDocument遍历PHP中的DOM树。对getElementById / getElementsByTagName的初始调用是成功的,但我不确定如何继续生成NodeList。
这是我试图遍历的HTML文件示例。
<!DOCTYPE html>
<html>
<div id="container">
<p> Hello </p>
</div>
</html>
在Javascript中,我可以像这样链接DOM遍历方法:
document.getElementById('container').getElementsByTagName('p')[0].innerText
// returns "Hello"
然而在PHP尝试类似......
<?php
$document = new DOMDocument();
$document->load('test.html');
echo $document->getElementById('content')->getElementsByTagName('p')->item(0)->nodeValue . PHP_EOL;
?>
...只是返回此错误:
Fatal error: Call to a member function getElementsByTagName() on a non-object in /Users/liam/foobar on line 6
我做错了什么或者根本不支持?
答案 0 :(得分:1)
您没有标识为content
的元素 - 它名为container
。
此外,您无法在任何旧的XML文档上调用getElementById
。它需要“一个DTD,它定义一个属性为ID的类型”(来自the manual)。告诉DOMDocument文档是HTML(在浏览器中使用Javascript时隐式完成)足以使用该函数。
在此,您应拨打DOMDocument::loadHTMLFile
而不是load
。
答案 1 :(得分:0)
在我看来,$document->getElementById('content')
为空,您需要将其更改为$document->getElementById('container')
。
答案 2 :(得分:0)
尝试xpath:http://php.net/manual/en/class.domxpath.php
<?php
$xpath = new DOMXPath($document);
$node = $xpath->query('//*[@id="container"]//p')->item(0);
if ($node instanceof DOMNode) {
echo $node->nodeValue . PHP_EOL;
}