XML验证错误:EntityRef:expecting';'

时间:2017-06-06 14:37:00

标签: php xml simplexml

我使用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&amp;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)

帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

html_entity_decode()不适用于您认为的目的,实际上是导致您出现问题的原因。顾名思义:它将html实体(如&amp;)解码为实际表示形式;在&amp; =&gt;的情况下&

如果您想将原始$rawstring的字符编码转换为ISO-8859-1UTF-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

但是,由于原始$rawstringLatin-1,因此转换为ISO-8859-1毫无意义,因为Latin-1 is ISO-8859-1。您可能需要转换为UTF-8,但我确信这甚至都不需要。