DOMDocument :: loadXML与HTML实体

时间:2010-02-14 17:42:01

标签: php xml html5 domdocument entities

我目前在使用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 个答案:

答案 0 :(得分:12)

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

而是使用数字字符引用(&#169;),或者更好的是,使用简单的未编码©字符(UTF-8;记住包含<meta>元素来表示字符设置为非XML解析器。)

答案 1 :(得分:2)

请尝试使用DOMDocument::loadHTML()。它不会阻塞不完美的标记。

答案 2 :(得分: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">


答案 3 :(得分:0)

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;