7

我目前在阅读 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 ();

结果是:

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

如何在允许自己将页面作为 XHTML5 提供服务的同时解决此问题?

4

4 回答 4

12

XHTML5 没有 DTD,因此您不能在其中使用老式的 HTML 命名实体,因为没有文档类型定义来告诉解析器该语言的命名实体是什么。(除了预定义的 XML 实体&lt;&amp;&quot;&gt;... 和&apos;,尽管您通常不想使用它)。

而是使用数字字符引用 ( &#169;),或者更好的是,只是一个普通的未编码©字符(在 UTF-8 中;记住要包含<meta>用于向非 XML 解析器表示字符集的元素)。

于 2010-02-14T18:41:16.553 回答
2

尝试DOMDocument::loadHTML()改用。它不会因不完美的标记而窒息。

于 2010-02-14T17:47:17.370 回答
0

您不应该使用 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">


于 2010-02-14T18:45:45.093 回答
0

尝试使用 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;
于 2010-02-14T18:45:47.947 回答