simpleXML和实体未定义的问题

时间:2009-09-15 12:22:04

标签: php xml simplexml

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

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

这就是那条线:

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

因为这是一个警告,我可能会忽略它,但我想了解发生了什么。

5 个答案:

答案 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)

尝试使用此行:

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

并阅读this about CDATA