Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php simpleXML和未定义实体的问题_Php_Xml_Simplexml - Fatal编程技术网

Php simpleXML和未定义实体的问题

Php simpleXML和未定义实体的问题,php,xml,simplexml,Php,Xml,Simplexml,我试图解析XML文件,但加载时simpleXML会打印以下警告: 警告:simplexml加载文件()[function.simplexml加载文件]:gpr_545.xml:55:解析器错误:import.php第35行未定义实体“Oslash” 这就是那句话: <forenames>B&Oslash;IE</forenames><x> </x> BØ;即 由于这是一个警告,我可能会忽略它,但我想了解发生了什么。我认为这是

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

警告:simplexml加载文件()[function.simplexml加载文件]:gpr_545.xml:55:解析器错误:import.php第35行未定义实体“Oslash”

这就是那句话:

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

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

我认为这是一个编码问题。php,在本例中是simplexml,不喜欢fornames标记中的丹麦语O。您可以尝试用utf-8对整个文件进行编码,并由此从标记中删除转义版本。此外,您可以将完全转义的无字符文件读入simplexml


K

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

HTML实体,如Ø与XML实体不同。用于将HTML实体替换为XML实体

正如我从你的一篇评论到另一篇文章中所看到的,你在实体&sol;方面遇到了问题;。我甚至不知道这是否是一个有效的HTML实体,我的Firefox不会显示字符-只输出实体名称。但我发现大多数实体和它们的字符参考号。尝试将它们添加到您的替换表中,您应该是安全的&索尔s的参考号是/顺便说一下。

试着用这行:

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


read也遇到了一个非常类似的问题,用下面的方法解决了它。其主要思想是将一个文件加载到一个字符串中,替换“[[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”编码

不确定您的意思。此xml文件编码为ISO-8859-1()。对:使用utf-8而不是ISO-8859-1yepp,并使用utf8_encode()对文本进行实际编码。如果我是作者,这是有意义的,但可以说,我处于解析端;-)你得到了这个文件,所以你可以逐行读取它并对它进行编码,不是吗?我碰巧为一位日本客户编写了一个xmlfilter应用程序。相信我,在实际解析之前多做这一步…;)是的,不可原谅的XML解析器在期望非ASCII字符的XML样式编码时会中断,而被指定为HTML样式编码。ok。所以我只是在分析这个。我查看了Björn答案中的表,它适用于我的第一个示例,但下一个问题是不在该表中的实体:&sol。有更稳定的解决方案吗?在将文档传递给XML解析器之前,XSLT转换文档将是一种解决方案。在解析之前,您应该为每个具有“奇怪”字符的实体插入CDATA标记。如果其中包含此错误,则从一开始就不是有效的XML。由你来告诉原始作者在解析和包装无效块之前修复它或进行此类检查。感谢表Björn,救了我一命!第一个链接不再可用,但第二个链接工作正常。两个链接都已失效。