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

如何使用Perl XML SAX解析器创建XML :: Simple数据结构?

发布时间:2020-12-16 06:08:56 所属栏目:大数据 来源:网络整理
导读:简介:我正在寻找一个快速的 XML解析器(很可能是一些标准SAX解析器的包装器),它将生成与 XML::Simple生成的数据结构100%相同的每个记录数据结构. 细节: 我们有一个庞大的代码基础结构,它依赖于处理记录,并且希望记录是XML :: Simple生成的格式的数据结构,
简介:我正在寻找一个快速的 XML解析器(很可能是一些标准SAX解析器的包装器),它将生成与 XML::Simple生成的数据结构100%相同的每个记录数据结构.

细节:

我们有一个庞大的代码基础结构,它依赖于处理记录,并且希望记录是XML :: Simple生成的格式的数据结构,因为它从早期的侏罗纪时代就一直使用XML :: Simple.

一个简单的XML示例是:

<root>
    <rec><f1>v1</f1><f2>v2</f2></rec>
    <rec><f1>v1b</f1><f2>v2b</f2></rec>
    <rec><f1>v1c</f1><f2>v2c</f2></rec>
</root>

例如粗略的代码是:

sub process_record { my ($obj,$record_hash) = @_; # do_stuff }
my $records = XML::Simple->XMLin(@args)->{root};
foreach my $record (@$records) { $obj->process_record($record) };

众所周知,XML :: Simple很简单.更重要的是,由于是一个DOM解析器并且需要在内存中构建/存储100%的数据,因此它非常慢且内存耗尽.因此,它不是解析包含大量小记录的XML文件的最佳工具.

但是,重写整个代码(包含大量“process_record”类似方法)来使用标准SAX解析器似乎是一项不值得资源的大任务,即使以使用XML :: Simple为代价也是如此.

我正在寻找一个现有的模块,它可能基于一个SAX解析器(或任何快速,内存占用很少),可以用来根据上面的图片逐个生成$record hashrefs,可以传递给$obj-> process_record($record)与XML :: Simple的hashrefs 100%完全相同.

我不在乎新模块的界面是什么;例如,我是否需要调用next_record()或给它一个接受记录的回调coderef.

解决方法

XML::Twig有一个简化方法,你可以调用XML元素,根据文档说:

Return a data structure suspiciously similar to XML::Simple’s

这是一个例子:

use XML::Twig;
use Data::Dumper;

my $twig = XML::Twig->new(
    twig_handlers => {
        rec => &;rec,}
)->parsefile( 'data.xml' );


sub rec {
    my ($twig,$rec) = @_;
    my $data = $rec->simplify;
    say Dumper $data;
    $rec->purge;
}

NB. $rec-> purge立即从内存中清除记录.

针对XML示例运行此操作会产生以下结果:

$VAR1 = {
          'f1' => 'v1','f2' => 'v2'
        };

$VAR1 = {
          'f1' => 'v1b','f2' => 'v2b'
        };

$VAR1 = {
          'f1' => 'v1c','f2' => 'v2c'
        };

我希望可疑的是XML :: Simple

(编辑:李大同)

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

    推荐文章
      热点阅读