gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:15:42 28 4
gpt4 key购买 nike

总结:我正在寻找一个快速的 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 为代价: :简单。

我正在寻找一个现有的模块,它可能基于 SAX 解析器(或任何快速且内存占用小的东西),可用于根据上图所示的 XML 可以传递给 $obj->process_record($record) 并且与 XML::Simple 的 hashrefs 100% 相同。

我不太关心新模块的接口(interface)是什么;例如,我是否需要调用 next_record() 或为其提供接受记录的回调代码引用。

最佳答案

XML::Twig有一个 simplify 方法,你可以调用一个 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;
}

注意。 $rec->purge 立即从内存中清除记录。

针对您的 XML 示例运行此命令会产生以下结果:

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

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

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

我希望它可疑像 XML::Simple 的结果 :)

/I3az/

关于xml - 如何使用 Perl XML SAX 解析器创建 XML::Simple 数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2912462/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com