我正在尝试解析XML文件,但在加载时,simpleXML会打印以下警告:
警告:simplexml_load_file()[function.simplexml-load-file]:gpr_545.xml:55:解析器错误:实体'Oslash'未在第35行的import.php中定义
这就是那条线:
<forenames>BØIE</forenames><x> </x>
因为这是一个警告,我可能会忽略它,但我想了解发生了什么。
答案 0 :(得分:3)
像&amp; Oslash这样的HTML实体与XML实体不同。 Here's a table用于将HTML实体替换为XML实体。
正如我可以从你的一条评论告诉另一篇文章,你遇到了一个实体/的问题。我不知道这是否是一个有效的HTML实体,我的Firefox不会显示该字符 - 只输出实体名称。但我发现大多数实体都有an other table及其字符参考编号。尝试将它们添加到替换表中,您应该是安全的。顺便提一下/的参考号。
答案 1 :(得分:2)
我认为这是编码问题。 php,simplexml在这种特殊情况下,不喜欢你在fornames标签中得到的丹麦语。您可以尝试在utf-8中编码整个文件,然后从标签中删除转义版本。 Aferwards你可以将完全转义的无字符文件读入simplexml。
ķ
答案 2 :(得分:2)
HTML编码Latin1字符(如Ø,该字符描述的内容)是打破XML解析器的原因。如果您控制数据,则需要使用XML样式字符编码来逃避它(Ø恰好是&amp;#216;)
答案 3 :(得分: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”编码
答案 4 :(得分:0)