我正在尝试解析 XML 文件,但是在加载它时 simpleXML 会打印以下警告:
警告:simplexml_load_file() [function.simplexml-load-file]:gpr_545.xml:55:解析器错误:实体 'Oslash' 未在第 35 行的 import.php 中定义
这是那一行:
<forenames>BØIE</forenames><x> </x>
由于这是一个警告,我可能会忽略它,但我想了解正在发生的事情。
我认为这是一个编码问题。php,在这种特殊情况下的 simplexml,不喜欢你在那个 fornames 标记中得到的丹麦语 O。您可以尝试在 utf-8 中对整个文件进行编码,然后从标签中删除转义版本。Aferwards 您可以将完全转义的无字符文件读入 simplexml。
ķ
Latin1 字符的 HTML 编码(如 Ø,该字符所描述的内容)是破坏 XML 解析器的原因。如果您可以控制数据,则需要使用 XML 样式字符编码对其进行转义(Ø 恰好是 Ø)
刚刚有一个非常相似的问题并通过以下方式解决了它。主要思想是将文件加载到字符串中,将所有坏实体替换为“[[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”编码