加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:22:26 所属栏目:大数据 来源:网络整理
导读:我需要用Perl解析一个巨大的文件. (所以我将使用流解析器…) 该文件包含多个 XML文档(对象),但没有根节点.这会导致XML解析器在第一个Object之后中止,就像它应该的那样. 答案可能是修复假根节点之前/之后. FAKE_ROOT_TAGOriginal Stream/FAKE_ROOT_TAG 由于文
我需要用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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读