2010-02-14 27 views
5

Tôi hiện đang có một vấn đề đọc trong XHTML như phân tích cú pháp XML không công nhận các tổ chức nhân vật HTML vậy:DOMDocument :: LoadXml vs Đối tượng HTML

<?php 
$text = <<<EOF 
<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Entities are Causing Me Problems</title> 
    </head> 
    <body> 
    <p>Copyright &copy; 2010 Some Bloke</p> 
    </body> 
</html> 
EOF; 

$imp = new DOMImplementation(); 
$html5 = $imp->createDocumentType ('html', '', ''); 
$doc = $imp->createDocument ('http://www.w3.org/1999/xhtml', 'html', $html5); 

$doc->loadXML ($text); 

header ('Content-Type: application/xhtml+xml; charset: utf-8'); 
echo $doc->saveXML(); 

Kết quả trong:

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Entity 'copy' not defined in Entity, line: 8 in testing.php on line 19

Làm cách nào để khắc phục sự cố này trong khi cho phép bản thân tôi phân phối các trang dưới dạng XHTML5?

Trả lời

11

XHTML5 không có DTD, vì vậy bạn không thể sử dụng HTML trường cũ được đặt tên thực thể, vì không có định nghĩa kiểu tài liệu để cho trình phân tích biết thực thể được đặt tên cho ngôn ngữ này. (Ngoại trừ các thực thể XML được xác định trước &lt;, &amp;, &quot;&gt; ... và &apos;, mặc dù bạn thường không muốn sử dụng điều đó). Thay vào đó hãy sử dụng tham chiếu ký tự số (&#169;) hoặc tốt hơn, chỉ là một ký tự không được mã hóa © đơn giản (trong UTF-8; hãy nhớ bao gồm phần tử <meta> để biểu thị ký tự được đặt thành các trình phân tích cú pháp không phải XML).

+0

Sau khi một số tìm kiếm xung quanh điều này thực sự có vẻ là trường hợp. Có vẻ kỳ lạ nhưng cảm ơn bạn rất nhiều vì thông tin. – casr

+0

+1 Wow, HTML 5 không có DTD? Không biết điều đó. – Gumbo

+0

HTML5 định nghĩa tất cả các thực thể HTML có tên là một phần của thông số của nó, nó chỉ * XHTML5 * không có, và chủ yếu là vì * XML * yêu cầu các định nghĩa này trong DTD mà HTML5/XHTML5 không có. – thomasrutter

2

Hãy thử sử dụng DOMDocument::loadHTML() để thay thế. Nó không bị nghẹt thở khi đánh dấu không hoàn hảo.

+4

Điều đó dẫn đến một số đầu ra sôi nổi (http://paste2.org/p/668291) chưa kể đến tôi không thích ý tưởng phân tích cú pháp XML dưới dạng HTML. – casr

0

Bạn không nên sử dụng LoadXml và saveXML và thêm ở phía trên cùng của một tài liệu html tag

<?xml. 

Thay vì sử dụng loadHTML và saveHTML và thêm một

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 


0

Hy thử với cdata

$text = <<<EOF 
<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Entities are Causing Me Problems</title> 
    </head> 
    <body> 
    <![CDATA[<p>Copyright &copy; 2010 Some Bloke</p>]]> 
    </body> 
</html> 
EOF; 
Các vấn đề liên quan