Проблемы PHP HTML DomDocument getElementById

Немного в новинку для 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> отметьте, поскольку это действительно имеет идентификатор?

8
задан Jé Queue 2 August 2010 в 21:52
поделиться

2 ответа

Руководство объясняет почему:

Чтобы эта функция работала, вам нужно либо установить некоторые атрибуты ID с помощью DOMElement->setIdAttribute(), либо DTD, который определяет атрибут как тип ID. В последнем случае перед использованием этой функции вам нужно будет проверить документ с помощью DOMDocument->validate() или DOMDocument->validateOnParse.

Во что бы то ни стало, перейдите на валидный HTML и предоставьте DTD.

Быстрые решения:

  1. Вызовите $dom->validate(); и смиритесь с ошибками (или исправьте их), после этого вы можете использовать $dom->getElementById(), независимо от ошибок по каким-то причинам.
  2. Используйте XPath, если вам не хочется использовать валидацию: $x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0);
  3. Если подумать: если просто установить 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'.

19
ответ дан 5 December 2019 в 07:33
поделиться

Ну, вы должны проверить, возвращает ли $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']"));
3
ответ дан 5 December 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: