2010-02-14 20 views
5

Al momento ho un problema di lettura in XHTML come il parser XML non riconosce le entità carattere HTML in modo:DOMDocument :: loadXML vs. entità 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(); 

risultati in:

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

Come posso risolvere questo problema mentre mi permetto di servire pagine come XHTML5?

risposta

11

XHTML5 non ha una DTD, quindi non è possibile utilizzare le entità denominate in HTML vecchia scuola al suo interno, in quanto non esiste una definizione del tipo di documento per dire al parser quali sono le entità denominate per questa lingua. (Ad eccezione delle entità XML predefinite &lt;, &amp;, &quot; e &gt; ... e &apos;, anche se generalmente non si desidera utilizzarle).

utilizzano invece un riferimento numerico carattere (&#169;) o, meglio, solo un semplice codificata © caratteri (UTF-8; ricordati di includere l'elemento <meta> per indicare il carattere impostato parser non XML).

+0

Dopo aver cercato in giro, sembra proprio che sia così. Sembra strano ma grazie mille per l'informazione. – casr

+0

+1 Wow, l'HTML 5 non ha una DTD? Non lo sapevo. – Gumbo

+0

HTML5 definisce tutte le vecchie entità HTML denominate come parte della sua specifica, è solo * XHTML5 * che non lo è, ed è principalmente perché * XML * richiede che siano definite in una DTD che HTML5/XHTML5 non ha. – thomasrutter

2

Provare a utilizzare DOMDocument::loadHTML() invece. Non soffoca il markup imperfetto.

+4

Ciò porta ad un output funky (http://paste2.org/p/668291) per non parlare dell'idea di analizzare l'XML come HTML. – casr

0

Non si deve usare loadXML e saveXML e aggiungere nella parte superiore di un documento HTML Il tag

<?xml. 

Invece che utilizzano loadHTML e saveHTML e aggiungere un

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


0

Hy try con 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;