我正在使用这里描述的方法处理外部xml文档(如何在PHP中使用XMLReader ?),但是我遇到了这个错误:
…解析器错误:实体'Atilde'没有定义在…
和类似的,例如
cent, acirc, not
在$z->expand()函数上发生错误。如果我把它注释掉,它就会出现在$z->next()函数上。
我知道问题字段,并试图在扩展之前用base64_encode编辑它,但它是只读的。
编辑:问题字符串是:
...ââ¬Â...
结束编辑
感谢您的帮助
XML只知道实体lt、gt、amp、apos和quot。因此任何其他实体引用都会引发错误。(注意字符引用和实体引用是不一样的。)
您可以使用strtr
来转换XML中不知道的任何HTML实体引用:
$trans = array_map('utf8_encode', array_flip(array_diff(get_html_translation_table(HTML_ENTITIES), get_html_translation_table(HTML_SPECIALCHARS))));
$output = strtr($input, $trans);
get_html_translation_table
返回一个数组,用于字符到实体引用的映射。get_html_translation_table(HTML_ENTITIES)
返回所有实体的映射,而get_html_translation_table(HTML_SPECIALCHARS)
只返回上述实体的映射。array_diff
将给出差异,所以所有实体没有上面提到的那些。array_flip
颠倒键/值关联,应用array_map
和utf8_encode
将值从ISO 8859-1转换为UTF-8。
也许xml_set_external_entity_ref_handler是您的情况的解决方案:
http://php.net/manual/en/example.xml-external-entity.php http://www.php.net/manual/en/function.xml-set-external-entity-ref-handler.php遇到了同样的问题…
我的解决方案是在notepad++中打开XML文件,搜索并替换为可读的字符。
不是一个漂亮的解决方案,但它工作;)
这是原始XML中的一个缺陷,但并不少见。这里的解决方案(除了Wout van der Vegt的)我没有太多的运气,所以这里是"创建一个固定的新XML"方法:
// Needs PHP 5.4.0+
$file = "xmldata_with_entities.xml";
$file2 = "xmldata_converted.xml";
$handle1 = fopen($file, "r");
$handle2 = fopen($file2, "w");
if ($handle1) {
while (($line = fgets($handle1)) !== false) {
fwrite($handle2, html_entity_decode($line,ENT_HTML5));
}
}
fclose($handle1);
fclose($handle2);
显然,您可以在XMLReader中使用$file2