这里有什么?
$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<album>
<img src="002.jpg" caption="wássup?" />
</album>
XML;
$xml = simplexml_load_string($string);
// $xmlobj = simplexml_load_file("xml.xml"); // same thing
echo "<pre>";
var_dump($xml);
echo "</pre>";
错误:
警告:simplexml_load_string()[function.simplexml-load-string]:实体:第5行:解析器错误:实体'aacute'未定义
答案 0 :(得分:14)
á
不是XML entity - 您正在考虑使用HTML。
特殊字符通常在XML中“按原样”使用 - 输入数据上的html_entity_decode()
(不要忘记指定UTF-8作为字符集)应该这样做:
$string = html_entity_decode($string, ENT_QUOTES, "utf-8");
答案 1 :(得分:2)
前几天我遇到了这个问题。 任何出现的&amp;将需要在CDATA标签内
<album>
<img src="002.jpg" />
<caption><![CDATA[now you can put whatever characters you need & include html]]></caption>
</album>
以防止解析器失败。
答案 2 :(得分:2)
您可能希望在替代方法上查看Matt Robinson's article:将命名实体转换为PHP中的数字。它提到html_entity_decode
方法(已经在另一个答案中指出)和一些潜在的陷阱:
这种方法存在两个可能的问题。第一个是无效的实体:
html_entity_decode()
不会触及它们,这意味着您仍然会遇到XML错误。第二是编码。我想你可能实际上并不想要UTF-8
。你应该,因为它很棒,但也许你有充分的理由。如果您没有告诉html_entity_decode()
使用UTF-8
,它将不会转换您指定的字符集中不存在的实体。如果你告诉它以UTF-8输出然后用iconv()
之类的东西来转换它,那么你将丢失任何不在输出编码中的字符。
此外,如果您发现脚本相当繁琐,您也可以使用shared on SourceRally。
答案 3 :(得分:1)
另一种解决方案是改变
"wássup?"
to
"w&aacute;ssup?"
答案 4 :(得分:0)
试试这个功能simplexml_load_entity_string
<?php
$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<album>
<img src="002.jpg" caption="test<wássup?" />
</album>
XML;
$xml = simplexml_load_entity_string($string);
var_dump($xml);
function simplexml_load_entity_string($string = '')
{
// cover entity except Predefined entities in XML
$string = str_replace([
'"', '&', ''', '<', '>',
], [
'SPECIALquotMARK', 'SPECIALampMARK', 'SPECIALaposMARK', 'SPECIALltMARK', 'SPECIALgtMARK',
], $string);
$string = html_entity_decode($string, ENT_QUOTES, "utf-8");
$string = str_replace([
'SPECIALquotMARK', 'SPECIALampMARK', 'SPECIALaposMARK', 'SPECIALltMARK', 'SPECIALgtMARK',
], [
'"', '&', ''', '<', '>',
], $string);
// load xml
return simplexml_load_string($string);
}