【问题标题】:PHP XMLReader stumbles upon invalid character and stopsPHP XMLReader 偶然发现无效字符并停止
【发布时间】:2012-03-06 09:50:30
【问题描述】:

正如标题所说。

我正在动态处理下载的大型 XML 文件。其中一些文件包含无效字符,例如“US”或“VB”(垂直选项卡)。不知道为什么这些角色一开始就在那里。我真的无能为力。

$z = new XMLReader;
$z->open('compress.zlib://'.$file, "UTF-8");
while ($z->read() && $z->name !== 'p');
while ($z->name === 'p'){

try
{
    $node = new SimpleXMLElement($z->readOuterXML());
}catch(Exception $e)
{
    echo $e->getMessage();
}
// And so on
}

我收到一条错误消息,提示“无法将字符串解析为 XML”。

我可以在这里做什么?

【问题讨论】:

  • 在解析之前将它们从文件中剥离出来。
  • xml 文件被 gzip 压缩。我需要提取、处理 12gb 的 xml 数据,然后进行解析——这需要每天完成,而且这些额外的步骤花费的时间太长。它不是一个选项 atm

标签: php xml parsing xmlreader


【解决方案1】:

最终还是找到了解决方案。

我决定使用fopen 即时构建和处理。这是我最终得到的结果:

$handle = fopen('compress.zlib://'.$file, 'r');
$xml_source = '';
$record = false;
if($handle){
    while(($buffer = fgets($handle, 4096)) !== false){
        if(strpos($buffer, '<open_tag>') > -1){
            $xml_source = '<?xml version="1.0" encoding="UTF-8"?>';
            $record = true;
        }
        if(strpos($buffer, '</close_tag') > -1){
            $xml_source .= $buffer;
            $record = false;
            $xml = simplexml_load_string(stripInvalidXml($xml_source));

            // ... do stuff here with the xml element

        }
        if($record){
            $xml_source .= $buffer;
        }

    }
}

simplexml_load_string() 函数是提供的一个 quickshiftin。像魅力一样工作。

【讨论】:

  • 哎呀 - 和 必须是同一个标签。 :)
  • 代码链接失效,所以目前答案不完整
  • @nick 你碰巧有stripInvalidXml 后面的代码吗,因为原来的链接现在已经失效了?我在另一篇 SO 帖子 here? 中找到了一个示例
猜你喜欢
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2018-08-29
  • 1970-01-01
  • 2021-09-25
相关资源
最近更新 更多