Немного новый для анализа PHP здесь, но я не могу заставить PHP DomDocument вернуть то, что явно является идентифицируемым узлом. Загруженный 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>
поскольку он действительно имеет идентификатор?
В Руководстве объясняется, почему:
Чтобы эта функция работала, вам нужно либо установить некоторые идентификационные атрибуты с помощью 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);
$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;
Выводит «Мир» здесь.
Ну, вы должны проверить, $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']"));