Немного в новинку для PHP, анализирующего здесь, но я, может казаться, не заставляю DomDocument PHP возвращать то, что является ясно идентифицируемым узлом. Загруженный HTML прибудет из 'сети, так не может обязательно гарантировать соответствие 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 с помощью DOMElement->setIdAttribute(), либо DTD, который определяет атрибут как тип ID. В последнем случае перед использованием этой функции вам нужно будет проверить документ с помощью DOMDocument->validate() или DOMDocument->validateOnParse.
Во что бы то ни стало, перейдите на валидный HTML и предоставьте DTD.
Быстрые решения:
$dom->validate();
и смиритесь с ошибками (или исправьте их), после этого вы можете использовать $dom->getElementById()
, независимо от ошибок по каким-то причинам. $x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0);
validateOnParse
в true перед загрузкой HTML, то тоже будет работать ;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;
Здесь выводится 'World'.
Ну, вы должны проверить, возвращает ли $dom->loadHTML($html);
true (успех) и я бы попробовал
var_dump($belement->nodeValue);
для вывода, чтобы понять, что может быть не так.
EDIT: 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']"));