PHP XMLReader problem with htmlentities


PHP XMLReader problem with htmlentities

我正在使用这里描述的方法处理外部xml文档(如何在PHP中使用XMLReader ?),但是我遇到了这个错误:

…解析器错误:实体'Atilde'没有定义在…

和类似的,例如

cent, acirc, not

在$z->expand()函数上发生错误。如果我把它注释掉,它就会出现在$z->next()函数上。

我知道问题字段,并试图在扩展之前用base64_encode编辑它,但它是只读的。

编辑:问题字符串是:

...ââ¬Â...

结束编辑

感谢您的帮助

XML只知道实体ltgtampaposquot。因此任何其他实体引用都会引发错误。(注意字符引用和实体引用是不一样的。)

您可以使用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_maputf8_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