php生成的xml文档中的实体声明( - etc)

时间:2011-05-12 00:40:57

标签: php html xml dom entity

这让我疯狂,网上有很多类似的问题,但我无法找到合适的解决方案。

我在php中创建一个xml文档,作为对ajax请求的响应发送。响应将如下所示:

<?xml version="1.0" encoding="iso-8859-1"?>
<response>
  <status>success</status>
  <message>&nbsp;&mdash;</message>
</response>

标签将包含比这更有意义的信息,但它是那些给我问题的实体。

生成该xml的php代码如下:

header("Content-Type: text/xml");

$dom = new DOMDocument('1.0', 'iso-8859-1');
$dom->formatOutput = true;

$response_node = $dom->createElement("response");
$dom->appendChild($response_node);
$response_node->appendChild($dom->createElement('status', 'success'));
$response_node->appendChild($dom->createElement('message', "&nbsp;&mdash"));
echo $dom->saveXML();
return;

上面显示的xml成功返回到进行调用的javascript函数,但是当它尝试解析xml文档时,它会失败。

如果我尝试使用this validator验证xml,我会收到以下错误:

  

此页面包含以下错误:

     第15行第5行的

错误:实体&#39; nbsp&#39;未定义

实体&mdash;会导致同样的问题。

我想我可能需要找到一种方法在xml中添加这样的东西:

<!ENTITY name "entity_value">

我不确定如何做到这一点,或者它是否是正确的方法。我不是正确的轨道吗?如果是这样我该怎么办?如果没有,解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

HTML实体名称在XML中无效,如果您指出的话,没有使用<!ENTITY name "...">定义它们。但是数字实体会做到这一点。

尝试更换:

&nbsp; =&gt; &#xA0;

&mdash; =&gt; &#x2014;

答案 1 :(得分:2)

这是解决问题的一种方法,添加一个定义实体的doctype声明:

$dom = new DOMDocument('1.0', 'iso-8859-1');
$dom->formatOutput = true;
$doctype = DOMImplementation::createDocumentType("html","-//W3C//DTD XHTML 1.1//EN","http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd");
$dom->appendChild($doctype);

$response_node = $dom->createElement("response");
$dom->appendChild($response_node);
$response_node->appendChild($dom->createElement('status', 'success'));
$response_node->appendChild($dom->createElement('message', "&nbsp;&mdash"));
echo $dom->saveXML();
return;

答案 2 :(得分:1)

- 非破坏空间是完全符合UTF-8的有效字符,允许使用XML格式。

如果您的原始邮件包含它并转换为要在XML中显示的实体,请指定您要转换XML的字符,而不是HTML:

PHP 5.4.0 +:

$encoded_value = htmlentities($value, ENT_COMPAT | ENT_XML1);

在较旧的PHP版本中,默认编码为ISO-8859-1,因此请将UTF-8指定为编码:

$encoded_value = htmlentities($value, ENT_COMPAT | ENT_XML1, 'UTF-8');

注意:您可以使用html_entity_decode函数从mdash实体获取。