这让我疯狂,网上有很多类似的问题,但我无法找到合适的解决方案。
我在php中创建一个xml文档,作为对ajax请求的响应发送。响应将如下所示:
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<status>success</status>
<message> —</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', " &mdash"));
echo $dom->saveXML();
return;
上面显示的xml成功返回到进行调用的javascript函数,但是当它尝试解析xml文档时,它会失败。
如果我尝试使用this validator验证xml,我会收到以下错误:
此页面包含以下错误:
第15行第5行的错误:实体&#39; nbsp&#39;未定义
实体—
会导致同样的问题。
我想我可能需要找到一种方法在xml中添加这样的东西:
<!ENTITY name "entity_value">
我不确定如何做到这一点,或者它是否是正确的方法。我不是正确的轨道吗?如果是这样我该怎么办?如果没有,解决这个问题的正确方法是什么?
答案 0 :(得分:2)
HTML实体名称在XML中无效,如果您指出的话,没有使用<!ENTITY name "...">
定义它们。但是数字实体会做到这一点。
尝试更换:
=&gt;  
—
=&gt; —
答案 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', " &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实体获取。