我使用PHP的SimpleXML处理XML文件,并收到此错误:
Message: simplexml_load_string(): Entity: line 9: parser error : EntityRef: expecting ';'
快速谷歌搜索显示,这通常是由一个未逃脱的& - Stack Overflow上有关于这个答案的十几个问题。但是,这是文件的第9行:
<p>In-kingdom commentary on the following items can be found on the November LoP. https://oscar.sca.org/kingdom/kingloi.php?kingdom=9&loi=4191</p>
正如你所看到的,&amp;被逃脱了。文件上的文本搜索显示没有&amp;的其他实例。
我错过了什么?
请注意:我无法编辑XML文件 - 我必须接受它并且只修复我的代码中的内容。我目前使用以下代码打开XML:
$rawstring = file_get_contents($filename);
$safestring = html_entity_decode($rawstring, 0, 'ISO-8859-1');
$xmlstring = simplexml_load_string($safestring);
(html_entity_decode是必要的,因为文件使用Latin-1编码而simplexml需要UTF-8)
帮助表示赞赏。
答案 0 :(得分:3)
html_entity_decode()
不适用于您认为的目的,实际上是导致您出现问题的原因。顾名思义:它将html实体(如&
)解码为实际表示形式;在&
=&gt;的情况下&
。
如果您想将原始$rawstring
的字符编码转换为ISO-8859-1
或UTF-8
,则应使用iconv()
或mb_convert_encoding()
之类的内容。
以下是应工作的示例:
$rawstring = file_get_contents($filename);
$safestring = mb_convert_encoding($rawstring, 'ISO-8859-1' /*, $optionalOriginalEncoding */);
$xmlstring = simplexml_load_string($safestring);
同时参见list of supported encodings。
但是,由于原始$rawstring
为Latin-1
,因此转换为ISO-8859-1
毫无意义,因为Latin-1
is ISO-8859-1
。您可能需要转换为UTF-8
,但我确信这甚至都不需要。