【问题标题】:Forcing UTF8 Format with PHP's XMLReader, DOM and SimpleXML使用 PHP 的 XMLReader、DOM 和 SimpleXML 强制 UTF8 格式
【发布时间】:2012-04-27 11:49:44
【问题描述】:

我们有一个脚本可以解析来自用户生成的源的 XML 提要,这些提要不时包含格式不正确的带有特殊字符的条目。

虽然我通常只在线运行 utf8_encode(),但我不确定如何执行此操作,因为 DOM 正在逐步读取文件,并且在执行扩展命令时会引发错误。

由于 simple_xml 阻塞了代码,后续行也关闭了。

这是代码。

$z = new XMLReader; 
$z->open($filename); $doc = new DOMDocument('1.0','UTF-8');         
while ($z->read() && $z->name !== 'product');   
while ($z->nodeType == XMLReader::ELEMENT AND $z->name === 'product'){
$producti = simplexml_import_dom($doc->importNode($z->expand(), true));
print_r($producti);
}

错误:

消息:XMLReader::expand(): foo.xml:29081: 解析器错误:输入是 不正确的UTF-8,表示编码!字节数:0x05 0x20 0x2D 0x35

严重性:警告

消息:XMLReader::expand():错误 展开时发生

文件名:controllers/feeds.php

行号:106

消息:传递给 DOMDocument::importNode() 的参数 1 必须是 DOMNode 实例,给定布尔值

文件名: controllers/feeds.php

行号:106

【问题讨论】:

  • 这些文档是否声明它们是用 UTF-8 编码的,而实际上它们不是,或者你只是不关心它们是什么编码和 假设它们是用 UTF-8 编码的?您是否有破坏解析器的文档样本?
  • 大多数声明 UTF-8,但不是全部。不幸的是,文件的可变性由我来处理,并给出发送数据的源类型。

标签: php xml xmlreader


【解决方案1】:

首先使用 HTML Tidy 库来清理你的字符串。

另外我最好使用 DOMDocument 而不是 XMLReader。

类似的东西:

        $tidy = new Tidy;

        $config = array(
                'drop-font-tags' => true,
                'drop-proprietary-attributes' => true,
                'hide-comments' => true,
                'indent' => true,
                'logical-emphasis' => true,
                'numeric-entities' => true,
                'output-xhtml' => true,
                'wrap' => 0
        );

        $tidy->parseString($html, $config, 'utf8');

        $tidy->cleanRepair();

        $xml = $tidy->value; // Get clear string

        $dom = new DOMDocument;

        $dom->loadXML($xml);

        ...

【讨论】:

  • 我会看看...任何洞察如何在循环中调用它以便过滤每个 xml 块?文件太大,无法提前清理(占用大量内存)。
  • 不只是整体应用 Tidy $filename。查看修改后的答案。
  • 谢谢。我需要一些时间才能从 XMLReader 重建到 DOM 以进行全面测试,但目前看来工作正常。
  • 对于其他人来说,这是一个非常小的错字,因为 DOMDocumet 应该是 DOMDocument
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2011-09-19
  • 1970-01-01
  • 2012-10-30
  • 2010-11-14
相关资源
最近更新 更多