PHP HTML DomDocument getElementById问题

时间:2010-08-02 21:31:23

标签: php html parsing

这里的PHP解析有点新,但我似乎无法让PHP的DomDocument返回明显可识别的节点。加载的HTML将来自'net,因此无法保证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);

?>

虽然我没有收到任何错误,但我只收到以下内容作为输出:

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

我是否应该无法查找<b>标记,因为它确实有ID?

2 个答案:

答案 0 :(得分:18)

The Manual解释了原因:

  

要使此功能起作用,您需要使用DOMElement-&gt; setIdAttribute()或DTD设置一些ID属性,DTD将属性定义为ID类型。在后一种情况下,您需要在使用此函数之前使用DOMDocument-&gt; validate()或DOMDocument-&gt; validateOnParse验证您的文档。

无论如何,请使用有效的HTML&amp;提供DTD。

快速修复:

  1. 致电$dom->validate();并忍受错误(或修复错误),之后您可以使用$dom->getElementById(),无论出于某种原因出现错误。
  2. 如果您不想使用XPath,请使用XPath:$x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0);
  3. 来想一想:如果你只是在加载HTML之前将validateOnParse设置为true ,那么它也会起作用; P
  4. $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;
    

    在这里输出'世界'。

答案 1 :(得分:3)

好吧,你应该检查$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']"));