PHP HTML DomDocument getElementById проблемы - PullRequest
8 голосов
/ 03 августа 2010

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

Ответы [ 2 ]

18 голосов
/ 03 августа 2010

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

Чтобы эта функция работала, вам потребуется либо установить некоторые атрибуты идентификатора с помощью 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 в значение до загрузки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;

Выводит здесь «Мир».

3 голосов
/ 03 августа 2010

Ну, вы должны проверить, вернет ли $dom->loadHTML($html); истину (успех), и я бы попробовал

 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']"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...