2010-02-14 23 views
5

HTML Entities vs loadXML: içindeDOMDocument :: Şu anda bu yüzden HTML karakter kodları tanımıyor XML ayrıştırıcı olarak XHTML'de okuma bir sorun var

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

Sonuçlar:

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

Kendimi XHTML5 olarak sayfaları sunmaya izin verirken bunu nasıl düzeltebilirim?

cevap

11

XHTML5'in bir DTD'si yoktur, bu nedenle, söz konusu ayrıştırıcıya adlandırılmış öğelerin bu dil için neler olduğunu anlatan belge türü tanımlaması olmadığından, içindeki eski HTML adı verilen varlıkları kullanamazsınız. (Önceden tanımlanmış XML varlıkları hariç &lt;, &amp;, &quot; ve &gt; ... ve &apos;, genellikle bunu kullanmak istemezsiniz).

yerine sayısal karakter referansı (&#169;) ya da daha iyi, sadece düz bir kodlanmamış © karakteri kullanın (UTF-8; olmayan XML çözümleyicinin karakter kümesini belirtmek için <meta> eleman eklemeyi unutmayın).

+0

Bazıları bunu araştırdıktan sonra durum böyle görünüyor. Tuhaf görünüyor ama bilgi için çok teşekkür ederim. – casr

+0

+1 Wow, HTML 5’in DTD'si yok mu? Bunu bilmiyordum. – Gumbo

+0

HTML5, tüm eski HTML adlı varlıklarını kendi özelliklerinin bir parçası olarak tanımlar; yalnızca * XHTML5 * içermez; bunun nedeni, temel olarak * XML *, HTML5/XHTML5'in sahip olmadığı bir DTD'de tanımlananları gerektirir. – thomasrutter

2

Bunun yerine DOMDocument::loadHTML() kullanmayı deneyin. Kusurlu işaretlemeyi bozmaz.

+4

Bu biraz funky çıktısına (http://paste2.org/p/668291) yol açtığından bahsetmiyorum bile, XML'i HTML olarak ayrıştırma fikrini sevmiyorum. – casr

0

Sen loadXML ve SaveXML kullanabilir ve etiketini html belgesinin en üstünde loadHTML ve saveHTML kullanmak yerine

<?xml. 

ekleyip eklemek gereken bir

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


0

Hy ile deneyin tnl

$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;