【问题标题】:PHP XMLReader problem with htmlentitieshtmlentities 的 PHP XMLReader 问题
【发布时间】:2011-11-08 12:46:32
【问题描述】:

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

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

和类似的,例如

cent,acirc,不是

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

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

编辑:问题字符串是:

...ââ¬Â...

结束编辑

感谢您提供的任何帮助。

【问题讨论】:

  • 你知道错误是由 HTML 实体引起的,那么你不应该使用 XML 解析器。改用 DOMDocument(就像您所包含的问题一样)
  • 这是一个很大的xml文档,所以我不能把所有的内存都用完

标签: php xmlreader html-entities


【解决方案1】:

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。

【讨论】:

  • 请问我应该使用什么作为输入?我尝试使用 $z->expand() 作为输入并得到错误:“可捕获的致命错误:DOMElement 类的对象无法在...中转换为字符串”
  • 哦,等一下。在$z->open(…) 之前设置$z->setProperty(XMLReader::SUBST_ENTITIES, true); 有效吗?
  • 它出现了“未定义”错误,但我发现了 setParserProperty,我猜你的意思是。不幸的是,它没有用。无论如何,谢谢你,我感谢你的时间和努力。我想我总是可以告诉 xml 提要供应商修复它,但他们会忽略我。
【解决方案2】:

【讨论】:

  • 我无法让它与 XMLReader 一起工作。你有例子吗?
【解决方案3】:

遇到了同样的问题..

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

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

【讨论】:

    【解决方案4】:

    这是原始 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多