簡體   English   中英

PHP HTML DOMDocument getElementById 問題

[英]PHP HTML DOMDocument getElementById problems

這里對 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>標簽,因為它確實有一個 id?

手冊解釋了原因:

要使此函數工作,您需要使用 DOMElement->setIdAttribute() 或 DTD 設置一些 ID 屬性,該 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. 想想看:如果您加載 HTML之前validateOnParse設置為 true,那么 if 也可以工作;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);

輸出以獲得可能出錯的線索。

編輯: 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']"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM