XML验证错误:EntityRef:预期';'。

13 浏览
0 Comments

XML验证错误:EntityRef:预期';'。

我正在使用PHP的SimpleXML来处理一个XML文件,但是出现了这个错误:

消息:simplexml_load_string():实体:第9行:解析器错误:EntityRef:预期';'

通过快速的谷歌搜索,我发现这通常是由于未转义的&符号引起的 - 在Stack Overflow上有很多关于这个答案的问题。然而,这是文件的第9行:

关于以下项目的国内评论可以在11月份的LoP上找到。https://oscar.sca.org/kingdom/kingloi.php?kingdom=9&loi=4191

如您所见,&符号已经被转义了。在文件中进行文本搜索也没有发现其他的&符号。

我漏掉了什么吗?

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

XML验证错误:EntityRef:期望';'。这个问题的出现原因是因为函数html_entity_decode()的使用方式错误,该函数用于解码HTML实体,例如将&解码为&。如果要将原始字符串的字符编码转换为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);

然而,由于原始的$rawstring是Latin-1编码,将其转换为ISO-8859-1是没有意义的,因为Latin-1就是ISO-8859-1。可能需要将其转换为UTF-8,但我相信这也是不必要的。

关于html_entity_decode()引起的问题,确实是有道理的。遗憾的是,mb_convert_encoding()也不能正常工作。使用下面这行代码将Latin-1(ISO-8859-1)转换为UTF-8时,特殊字符无法正确处理:

$safestring = mb_convert_encoding($rawstring, 'UTF-8', 'ISO-8859-1');

例如,原始字符串中的'Æ'和'ö'在输出中都变为了'Ã'。这个XML集中使用了很多外文字符,保留它们非常重要。

您是如何查看输出的?如果在浏览器中查看输出,请确保正确设置HTTP Content-Type头,例如:Content-Type: text/xml; charset=utf-8。可以参考这个问题了解更多选项。

所以这里有个奇怪的问题。使用下面的代码:

$rawstring = file_get_contents($filename);
$safestring = mb_convert_encoding($rawstring, 'UTF-8', 'ISO-8859-1');
$xmlstring = simplexml_load_string($safestring);

然后使用echo $xmlstring->asXML();一切看起来都很好。但是当我遍历这个字符串时,有一些代码用于从XML中提取相关项。具体来说,我有以下嵌套项(跳过无关的部分):

foreach ($xmlstring->xpath('//item') as $item) {
    $sectionxml = simplexml_load_string($item->discussion->{'name-discussion'}->asXML());
    $namediscussion = '';
    foreach($sectionxml->xpath('//p') as $p) {
        $namediscussion = $namediscussion . strip_tags($p->asXML()) . '
'; } }

然后使用echo $namediscussion,外文字符就乱码了,尽管已经设置了content-type。

0