PHP DOMDocument在NodeList上调用getElementsByTagName

时间:2011-05-18 14:38:24

标签: php dom

我正在尝试使用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

我做错了什么或者根本不支持?

3 个答案:

答案 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;
}