我试图解析XML文件,但是加载它的SimpleXML打印以下警告时:
警告:使用simplexml_load_file()[function.simplexml负荷文件]:gpr_545.xml:55:分析器错误:实体 'Oslash' 在import.php未定义线路35上
这是该行:
<forenames>BØIE</forenames><x> </x>
由于这是一个警告,我可能会忽略它,但我想明白发生了什么。
我试图解析XML文件,但是加载它的SimpleXML打印以下警告时:
警告:使用simplexml_load_file()[function.simplexml负荷文件]:gpr_545.xml:55:分析器错误:实体 'Oslash' 在import.php未定义线路35上
这是该行:
<forenames>BØIE</forenames><x> </x>
由于这是一个警告,我可能会忽略它,但我想明白发生了什么。
的Latin1的字符HTML编码(如直径,这是什么字描述)是什么打破了XML解析器。 如果您在数据的控制的时候,你需要使用XML风格的字符编码逃避它(直径恰好是&#216;)
HTML实体喜欢&Oslash是不一样的XML实体。 这里有一个表替换HTML实体,以XML的实体。
正如我可以从你的评论人告诉另一职务,你有与实体/麻烦。 我不知道这甚至是一个有效的HTML实体,我的Firefox将不显示字符 - 仅在OUPUTS实体名称。 但我发现的其它表的大多数实体和他们的性格参考号码。 试着将它们添加到您的替换表,你应该是安全的。 /人的参考号是/通过的方式。
我认为这是一个编码的问题。 PHP,SimpleXML的在这种特殊情况下,不喜欢你有在fornames标签丹麦O操作。 你可以尝试在编码UTF-8和去除通过该标签的转义版本的整个文件。 Aferwards你可以阅读完全转义字符免费文件到simplexml的。
ķ
只是有一个非常类似的问题,解决它以下列方式。 其主要思想是将文件加载到一个字符串,替换上像所有的坏实体“[实体] 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” 编码
尝试使用这一行:
<forenames><![CDATA[BØIE]]></forenames><x> </x>
和阅读这个关于CDATA