Perl:如何在没有根节点的情况下处理XML对象流

前端之家收集整理的这篇文章主要介绍了Perl:如何在没有根节点的情况下处理XML对象流前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要用Perl解析一个巨大的文件. (所以我将使用流解析器…)
文件包含多个 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;
}

猜你在找的Perl相关文章