使用PHP强制使用UTF8格式';s XMLReader、DOM和SimpleXML

使用PHP强制使用UTF8格式';s XMLReader、DOM和SimpleXML,php,xml,xmlreader,Php,Xml,Xmlreader,我们有一个脚本,它解析来自用户生成的源的XML提要,这些源不时包含格式不正确的带有特殊字符的条目 虽然我通常会在这一行上运行utf8_encode(),但我不确定如何执行此操作,因为DOM正在逐步读取文件,并且在执行expand命令时会抛出错误 由于simple_xml阻塞了代码,后续行也被关闭 这是密码 $z = new XMLReader; $z->open($filename); $doc = new DOMDocument('1.0','UTF-8'); whi

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

虽然我通常会在这一行上运行utf8_encode(),但我不确定如何执行此操作,因为DOM正在逐步读取文件,并且在执行expand命令时会抛出错误

由于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


首先使用HTMLTidy库来清理字符串

另外,我最好使用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的重建需要一些时间来进行全面测试,但到目前为止似乎还可以。对于其他人来说,DOMDocument应该是DOMDocument,这是一个非常小的错误。这些文档是否声明它们是用UTF-8编码的,而实际上它们不是,或者你只是不在乎它们是什么编码,并且假设它们是UTF-8编码的?您是否有破坏解析器的文档示例?大多数文档声明UTF-8,但不是全部。不幸的是,我要处理文件的可变性,给出发送数据的源的类型。