2010-02-14 12 views
5

Obecnie mam problem z odczytem w XHTML jak parsera XML nie rozpoznaje znaków HTML podmioty sposób:DOMDocument :: loadXML vs. Podmiotów 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(); 

wyniki w:

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

Jak mogę to naprawić, pozwalając sobie na obsługę stron jako XHTML5?

Odpowiedz

11

XHTML5 nie ma DTD, więc nie można używać w nim oldschoolowych nazw HTML, ponieważ nie ma definicji typu dokumentu, która wskazywałaby analizatorowi, jakie nazwane encje dotyczą tego języka. (Z wyjątkiem predefiniowanych jednostek XML: &lt;, &amp;, , ale generalnie nie chcesz tego używać).

Zamiast używać numeryczną odniesienie znaków (&#169;) albo, lepiej, tylko zwykły niezakodowany © charakter (w UTF-8; pamiętają włączyć element <meta> oznaczać zestaw znaków do parserami non-XML).

+0

Po pewnym przeszukiwaniu wydaje się, że tak jest. Wydaje się dziwne, ale bardzo dziękuję za informacje. – casr

+0

+1 Wow, HTML 5 nie ma DTD? Tego nie wiedziałem. – Gumbo

+0

HTML5 definiuje wszystkie stare nazwane obiekty HTML jako część specyfikacji, to tylko * XHTML5 *, które tego nie robią, a to głównie dlatego, że * XML * wymaga definicji zdefiniowanych w DTD, których nie ma HTML5/XHTML5. – thomasrutter

2

Zamiast tego spróbuj użyć DOMDocument::loadHTML(). Nie dusi się na niedoskonałych znacznikach.

+4

To prowadzi do niektórych efektów funky (http://paste2.org/p/668291), nie wspominając o tym, że nie lubię idei parsowania XML jako HTML. – casr

0

Nie należy stosować loadXML i saveXML i dodać na górze dokumentu HTML tag

<?xml. 

zamiast tego użyć loadHTML i saveHTML i dodaj

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


0

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