PHP XMLReader与htmlentities的问题

时间:2011-09-01 15:52:07

标签: php xmlreader html-entities

我正在使用此处描述的方法(How to use XMLReader in PHP?)处理外部xml文档,但我遇到了这个错误:

  

...解析器错误:实体'Atilde'未在...中定义

和类似的,例如

  

分,acirc,不是

$ z-> expand()函数发生错误。如果我对此进行评论,它将出现在$ z-> next()函数中。

我知道问题字段并尝试在扩展前使用base64_encode对其进行编辑,但它只是readonly。

编辑:问题字符串是:

...ââ¬Â...

结束编辑

感谢您提供任何帮助。

4 个答案:

答案 0 :(得分:2)

XML does only know the entities lt, gt, amp, apos, and quot.所以任何其他entity reference都会引发错误。 (请注意character references和实体引用不相同。)

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

答案 1 :(得分:1)

答案 2 :(得分:0)

遇到同样的问题..

我的解决方案是在记事本++中打开XML文件,搜索并将字符替换为可读字符。

不是一个漂亮的解决方案,但它有效;)

答案 3 :(得分:0)

这是原始XML中的一个缺陷,但这种情况并不少见。我在这里的解决方案中没有多少运气(除了Wout van der Vegt' s),所以在这里制作了一个新的XML,这个解决方案已经修好了#34;的方法:

// 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。