这里的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?
答案 0 :(得分:18)
The Manual解释了原因:
要使此功能起作用,您需要使用DOMElement-&gt; setIdAttribute()或DTD设置一些ID属性,DTD将属性定义为ID类型。在后一种情况下,您需要在使用此函数之前使用DOMDocument-&gt; validate()或DOMDocument-&gt; validateOnParse验证您的文档。
无论如何,请使用有效的HTML&amp;提供DTD。
快速修复:
$dom->validate();
并忍受错误(或修复错误),之后您可以使用$dom->getElementById()
,无论出于某种原因出现错误。$x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0);
validateOnParse
设置为true ,那么它也会起作用; 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;
在这里输出'世界'。
答案 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']"));