【问题标题】:XML Validation error : EntityRef: expecting ';'XML 验证错误:EntityRef:期待“;”
【发布时间】:2017-11-07 15:27:02
【问题描述】:

我正在使用 PHP 的 SimpleXML 处理一个 XML 文件,并得到这个错误:

Message: simplexml_load_string(): Entity: line 9: parser error : EntityRef: expecting ';'

快速的 Google 搜索显示,这通常是由未转义的 & 引起的 - 在 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>

如您所见,& 被转义了。对该文件的文本搜索未发现其他 & 实例。

我错过了什么?

请注意:我无法编辑 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)

帮助表示赞赏。

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    html_entity_decode() 并非用于您认为它的用途,实际上正是导致您的问题的原因。顾名思义:它将 html 实体(如 &amp;amp;)解码为它们的实际表示;对于&amp;amp; => &amp;

    如果要将原始$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,但我相当肯定这也没有必要。

    【讨论】:

    • 由 html_entity_decode() 引起的问题当然是有道理的——没想到这一点。不幸的是, mb_convert_encoding 也不能正常工作。我使用了这条线: $safestring = mb_convert_encoding($rawstring, 'UTF-8', 'ISO-8859-1');从 Latin-1 (ISO-8859-1) 转换为 UTF-8,它没有正确处理特殊字符。例如,原来的 'Æ' 和 'ö' 在输出中都变成了 'Ã'。这个 XML 集使用了很多外来字符,保留它们很重要。
    • 您如何查看输出?如果您在浏览器中查看输出,请确保设置了正确的 HTTP Content-Type 标头,例如:Content-Type: text/xml; charset=utf-8。查看this question 了解更多选项。
    • 这就是奇怪的事情。使用此代码:$rawstring = file_get_contents($filename); $safestring = mb_convert_encoding($rawstring, 'UTF-8', 'ISO-8859-1'); $xmlstring = simplexml_load_string($safestring); 然后执行echo xmlstring-&gt;asXML(); 一切看起来都不错。但后来我通过了那个字符串。我有一些通过 XML 提取相关项目的代码。具体来说,我有以下嵌套项目(跳过不相关的东西):
    • foreach ($xmlstring-&gt;xpath('//item') as $item) {$sectionxml = simplexml_load_string($item-&gt;discussion-&gt;{'name-discussion'}-&gt;asXML());$namediscussion = '';foreach($sectionxml-&gt;xpath('//p') as $p) {$namediscussion = $namediscussion . strip_tags($p-&gt;asXML()) . '&lt;/br&gt;'; }}}echo $namediscussion,外来字符都是乱码。
    • 尽管设置了内容类型。
    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多