我需要用Perl解析一个巨大的文件. (所以我将使用流解析器…)
该文件包含多个 XML文档(对象),但没有根节点.这会导致XML解析器在第一个Object之后中止,就像它应该的那样.
答案可能是修复假根节点之前/之后.
该文件包含多个 XML文档(对象),但没有根节点.这会导致XML解析器在第一个Object之后中止,就像它应该的那样.
答案可能是修复假根节点之前/之后.
<FAKE_ROOT_TAG>Original Stream</FAKE_ROOT_TAG>
由于文件很大(> 1GByte),我不想复制/重写它,而是宁愿使用透明(对于XML Parser)“合并”或“合并”多个流的类/模块.
stream1 : <FAKE_ROOT_TAG> \ stream2 : Original Stream from file > merged stream stream3 : </FAKE_ROOT_TAG> /
你能指点我这个问题的模块或示例代码吗?
解决方法
这是从
PerlMonks开始的一个技巧:
#!/usr/bin/perl use strict; use warnings; use XML::Parser; use XML::LibXML; my $doc_file= shift @ARGV; my $xml=qq{ <!DOCTYPE doc [<!ENTITY real_doc SYSTEM "$doc_file">] > <doc> &real_doc; </doc> }; { print "XML::Parser:\n"; my $t= XML::Parser->new( Style => 'Stream')->parse( $xml); } { print "XML::LibXML:\n"; my $parser = XML::LibXML->new(); my $doc = $parser->parse_string($xml); print $doc->toString; }