2

我正在尝试解析 XML 文件,但是在加载它时 simpleXML 会打印以下警告:

警告:simplexml_load_file() [function.simplexml-load-file]:gpr_545.xml:55:解析器错误:实体 'Oslash' 未在第 35 行的 import.php 中定义

这是那一行:

<forenames>B&Oslash;IE</forenames><x> </x>

由于这是一个警告,我可能会忽略它,但我想了解正在发生的事情。

4

5 回答 5

3

Ø 之类的 HTML 实体与 XML 实体不同。这是一个用于将 HTML 实体替换为 XML 实体的表格。

从您的一个评论到另一篇帖子我可以看出,您在使用实体 / 时遇到了问题。我不知道这是否是一个有效的 HTML 实体,我的 Firefox 不会显示该字符 - 只会输出实体名称。但我为大多数实体及其字符参考号找到了另一个表。尝试将它们添加到您的替换表中,您应该是安全的。/ 的参考编号是 / 顺便说一下。

于 2009-09-15T12:32:37.603 回答
2

我认为这是一个编码问题。php,在这种特殊情况下的 simplexml,不喜欢你在那个 fornames 标记中得到的丹麦语 O。您可以尝试在 utf-8 中对整个文件进行编码,然后从标签中删除转义版本。Aferwards 您可以将完全转义的无字符文件读入 simplexml。

ķ

于 2009-09-15T12:29:13.910 回答
2

Latin1 字符的 HTML 编码(如 Ø,该字符所描述的内容)是破坏 XML 解析器的原因。如果您可以控制数据,则需要使用 XML 样式字符编码对其进行转义(Ø 恰好是 Ø)

于 2009-09-15T12:31:55.370 回答
1

刚刚有一个非常相似的问题并通过以下方式解决了它。主要思想是将文件加载到字符串中,将所有坏实体替换为“[[entity]]Oslash;” 并在显示一些 xml 节点之前进行反向替换。

function readXML($filename){
    $xml_string = implode("", file($filename));
    $xml_string = str_replace("&", "[[entity]]", $xml_string);
    return simplexml_load_string($xml_string);
}
function xml2str($xml){
    $str = str_replace("[[entity]]", "&", (string)$xml);
    $str = iconv("UTF-8", "WINDOWS-1251", $str);
    return $str;
}
$xml = readXML($filename);
echo xml2str($xml->forenames);

iconv("UTF-8", "WINDOWS-1251", $str) 因为我的页面上有“WINDOWS-1251”编码

于 2013-01-30T09:37:42.603 回答
0

尝试使用这一行:

<forenames><![CDATA[B&Oslash;IE]]></forenames><x> </x>

并阅读有关 CDATA 的内容

于 2009-09-15T12:33:00.330 回答