我使用 PHPzip://
流包装器逐行解析大型 XML 文件。例如:
$stream_uri = 'zip://' . __DIR__ . '/archive.zip#foo.xml';
$reader = new XMLReader();
$reader->open( $stream_uri, null );
$reader->read();
while ( true ) {
echo( $reader->readInnerXml() . PHP_EOL );
if ( ! $reader->next() ) {
break;
}
}
XML 文件通常会包含XMLReader
不喜欢的狡猾的 UTF 控制字符。所以我想实现一个自定义流包装器,我可以将zip://
流的输出传递给它,它将preg_replace
在每一行运行一个来删除这些字符。
我的梦想是能够做到这一点:
stream_wrapper_register( 'xmlchars', 'XML_Chars' );
$stream_uri = 'xmlchars://zip://' . __DIR__ . '/archive.zip#foo.xml';
并XMLReader
愉快地阅读了整理好的节点。我已经找到了一种基于传递给我的包装器的路径来重建 zip 流 URI 的方法:
class XML_Chars {
protected $stream_uri = '';
protected $handle;
function stream_open( $path, $mode, $options, &$opened_path ) {
$parsed_url = parse_url( $path );
$this->stream_uri = 'zip:' . $parsed_url['path'] . '#' . $parsed_url['fragment'];
return true;
}
}
但是我对打开zip://
流的最佳方式感到困惑,这样我就可以修改它的输出并将结果传递给XMLReader
. 谁能给我有关如何实现它的任何指示?