2010-08-02 33 views
7

Một chút mới đối với việc phân tích cú pháp PHP ở đây, nhưng tôi dường như không thể lấy được tài liệu DomDocument của PHP để trả về một nút rõ ràng là gì. HTML nạp sẽ đến từ 'thuần như vậy có thể không nhất thiết phải đảm bảo tuân thủ XML, nhưng tôi thử như sau:PHP HTML DomDocument Các vấn đề về getElementById

<?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); 

?> 

Mặc dù tôi không nhận lỗi, tôi chỉ nhận được sau khi đầu ra:

object(DOMDocument)#1 (0) { 
} 
NULL 

Tôi không thể tra cứu thẻ <b> vì nó thực sự có id không?

Trả lời

17

The Manual giải thích tại sao:

Đối với chức năng này để làm việc, bạn sẽ cần một trong hai thiết lập một số thuộc tính ID với DOMElement-> setIdAttribute() hoặc một DTD xác định thuộc tính là loại ID. Trong trường hợp sau, bạn sẽ cần phải xác thực tài liệu của mình bằng DOMDocument-> validate() hoặc DOMDocument-> validateOnParse trước khi sử dụng chức năng này.

Bằng mọi cách, hãy truy cập HTML hợp lệ & cung cấp DTD.

Sửa nhanh:

  1. Gọi $dom->validate(); và đưa lên với các lỗi (hoặc sửa chữa chúng), sau đó bạn có thể sử dụng $dom->getElementById(), không phụ thuộc vào lỗi vì một lý do.
  2. Sử dụng XPath nếu bạn không cảm thấy như validing: $x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0);
  3. Hãy đến với suy nghĩ của nó: nếu bạn chỉ cần đặt validateOnParse true trước tải HTML, nếu cũng sẽ làm việc; 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; 

Đầu ra 'Thế giới' tại đây.

+0

Tôi đã xác thựcOnParse. setIdAttribute chỉ áp dụng cho thiết lập và sau đó truy xuất tiếp theo? Một lần nữa, HTML sẽ được cung cấp trên web vì vậy tôi đang ở lòng thương xót của họ, nhưng chỉ cần thử một ví dụ. HTML5 thậm chí không có DTD, phải không? – Xailor

+0

"setIdAttribute chỉ áp dụng cho thiết lập và sau đó truy xuất tiếp theo?" -> Có. HTML5 chưa hoàn thành nên chưa có DTD. –

+0

DTD sẽ là '', nhưng chỉ cần gọi '$ dom-> validate()' cũng sẽ hoạt động.Đưa ra các lỗi hoặc cố gắng để tạo ra HTML hợp lệ (sau này là khó khăn hơn có vẻ như ... :)) – Wrikken

3

Vâng, bạn nên kiểm tra nếu $dom->loadHTML($html); trả về true (thành công) và tôi sẽ cố gắng

var_dump($belement->nodeValue); 

cho đầu ra để có được một đầu mối những gì có thể là sai.

EDIT: http://www.php-editors.com/php_manual/function.domdocument-get-element-by-id.html - có vẻ như DomDocument sử dụng XPath trong nội bộ.

Ví dụ:

$xpath = xpath_new_context($dom); 
var_dump(xpath_eval_expression($xpath, "//*[@ID = 'YOURIDGOESHERE']")); 
+0

Bài đăng gốc được sửa đổi để phản ánh các đầu ra này. Cảm ơn, – Xailor

Các vấn đề liên quan