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

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

Related of "PHP HTML DomDocument getElementById проблемы"

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

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

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

Ну, вы должны проверить, $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']"));