DOMDocument :: loadXML против HTML-сущностей - PullRequest
6 голосов
/ 14 февраля 2010

В настоящее время у меня проблема с чтением в XHTML, поскольку анализатор XML не распознает символьные объекты 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 ();

Результат:

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

Как я могу это исправить, позволяя себе обслуживать страницы как XHTML5?

Ответы [ 4 ]

12 голосов
/ 14 февраля 2010

XHTML5 не имеет DTD, поэтому вы не можете использовать в нем именованные сущности старой школы HTML, так как нет определения типа документа, чтобы сообщить анализатору, какие именованные сущности предназначены для этого языка. (За исключением предопределенных сущностей XML &lt;, &amp;, &quot; и &gt; ... и &apos;, хотя, как правило, вы не хотите использовать это).

Вместо этого используйте цифровую ссылку на символ (&#169;) или, что лучше, просто незашифрованный символ © (в UTF-8; не забудьте включить элемент <meta> для обозначения набора символов для синтаксических анализаторов не-XML ).

2 голосов
/ 14 февраля 2010

Попробуйте использовать DOMDocument::loadHTML() вместо этого. Это не душит несовершенную разметку.

0 голосов
/ 14 февраля 2010

Hy попробуйте с 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;
0 голосов
/ 14 февраля 2010

Вы не должны использовать loadXML и saveXML и добавлять в верхней части HTML-документа тег

<?xml.

Вместо этого используйте loadHTML и saveHTML и добавьте

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


...