PHP的HTML DomDocument getElementById问题

这里有一点新的PHPparsing,但我似乎无法得到PHP的DomDocument返回显然是一个可识别的节点。 加载的HTML将来自'networking,所以不一定能保证XML合规性,但我尝试以下:

<?php header("Content-Type: text/plain"); $html = '<html><body>Hello <b id="bid">World</b>.</body></html>'; $dom = new DomDocument; $dom->preserveWhiteSpace = false; $dom->validateOnParse = true; /*** load the html into the object ***/ $dom->loadHTML($html); var_dump($dom); $belement = $dom->getElementById("bid"); var_dump($belement); ?> 

尽pipe我没有收到任何错误,但我只收到以下内容:

 object(DOMDocument)#1 (0) { } NULL 

我应该不能查找<b>标签,因为它确实有一个ID?

手册解释了为什么:

为了使这个function起作用,你需要用DOMElement-> setIdAttribute()来设置一些ID属性,或者用一个DTD来定义一个属性为IDtypes的属性。 在后面的例子中,在使用这个函数之前,需要使用DOMDocument-> validate()或者DOMDocument-> validateOnParse来validation文档。

通过一切手段,去有效的HTML和提供一个DTD。

快速修复:

  1. 调用$dom->validate(); 并提出错误(或解决它们),之后可以使用$dom->getElementById() ,无论出于某种原因的错误。
  2. 使用XPath,如果你不想要validing: $x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0); $x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0);
  3. 来想一想:如果你只是加载HTML 之前设置validateOnParse为真,如果也可以工作; P

 $dom = new DOMDocument(); $html ='<html> <body>Hello <b id="bid">World</b>.</body> </html>'; $dom->validateOnParse = true; //<!-- this first $dom->loadHTML($html); //'cause 'load' == 'parse $dom->preserveWhiteSpace = false; $belement = $dom->getElementById("bid"); echo $belement->nodeValue; 

在这里输出“世界”。

那么,你应该检查$dom->loadHTML($html); 返回true(成功),我会尝试

  var_dump($belement->nodeValue); 

为输出得到一个线索可能是错误的。

编辑: http ://www.php-editors.com/php_manual/function.domdocument-get-element-by-id.html – 它似乎DomDocument内部使用XPath。

例:

 $xpath = xpath_new_context($dom); var_dump(xpath_eval_expression($xpath, "//*[@ID = 'YOURIDGOESHERE']"));