我正在使用此处描述的方法(How to use XMLReader in PHP?)处理外部xml文档,但我遇到了这个错误:
...解析器错误:实体'Atilde'未在...中定义
和类似的,例如
分,acirc,不是
$ z-> expand()函数发生错误。如果我对此进行评论,它将出现在$ z-> next()函数中。
我知道问题字段并尝试在扩展前使用base64_encode对其进行编辑,但它只是readonly。
编辑:问题字符串是:
...ââ¬Â...
结束编辑
感谢您提供任何帮助。
答案 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_map
与utf8_encode
一起使用会将ISO 8859-1中的值转换为UTF-8。
答案 1 :(得分:1)
也许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
答案 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。