ruby - 在 Ruby 中,是否有可能对一个由 SAX 解析的巨大 XML 的一部分进行 DOM 解析?
问题描述
我需要在 Ruby 中解析一个巨大的 XML 文件(70GB 大),目前我正在使用 Nokogiri 的 SAX 解析器。这个文件非常大,但它由一个根元素和许多条目组成,所有这些条目的大小都非常易于管理。必须以基于事件的方式进行所有解析非常困难。即使整个文件被解析为 SAX,有没有办法将这些条目中的每一个解析为 DOM?
例如,我正在考虑使用所有start_element
andclose_element
调用构建 dom,在最后一个调用中,当记录关闭时,获取该 DOM 并在那里进行处理。当然,我不是第一个想到这种解决方案的人。
解决方案
rminner 写在这里
“我个人认为 XML::DOM 不是正确的解决方案,如果您的输入 xml 文件非常大。我解析 xml 的首选选择是 XML::Twig。我正在使用它来解析非常大的文件,它正在以低内存使用快速完成。同样可能适用于其他模块,但我最熟悉 XML::Twig。
“我准备了一个简短的示例,说明如何使用 XML::Twig 进行解析。由于我不确切知道您打算做什么,因此我添加了几个示例方法调用以使您走上正确的轨道(以防您永远决定使用它)。”
use strict;
use warnings;
use Data::Dumper;
#use Data::Dumper::Concise; # i prefer Data::Dumper::Concise
use XML::Twig;
# individually process each <signal> element
sub signal_handler {
my ($data, $twig, $elem) = @_;
# get the attributes of $elem (<signal>)
my $atts = $elem->atts();
if ($atts->{'sigid'} == 3464) {
print "Found <signal> with sigid == 3464:\n",$elem->sp
+rint(),"\n";
print "<PRESS ENTER TO CONTINUE>";<STDIN>;
}
# if you want to access the element in a way similar to XML::S
+imple:
my $xml_simple_style_elem = $elem->simplify();
# check out the simplified structure:
print Dumper($xml_simple_style_elem);
print "<PRESS ENTER TO CONTINUE>";<STDIN>;
# Example for Data Collection:
my ($sigid, $id) = @{$atts}{qw/sigid id/};
if (defined $sigid and defined $id) {
$data->{sigid_id_count}{$sigid}{$id}++;
}
# get all elements below <signal> which are called <foo>
my @foo_subelements = $elem->descendants('foo');
$twig->purge; # explicitly free the memory
};
sub main {
my $fn = shift @ARGV;
my %collected_data;
my $twig = XML::Twig->new(
twig_roots => {
'signal' => sub {signal_handler(\%collect
+ed_data, @_);},
},
);
eval {
$twig->parsefile($fn);
};
if ($@) {
print STDERR "Failed to parse '$fn' ($@)\n";
}
if (%collected_data) {
print "I collected the following data:\n",Dumper(\%col
+lected_data);
}
}
main();
请单击此处获取完整文档
推荐阅读
- java-8 - 基于多个值对地图进行排序(Java8/Jooq)
- json - '[错误] 无法在 CWD 中找到或读取“package.json”。“release-react”命令必须在 React Native 项目文件夹中执行。
- python - 将带有键和值的字符串转换为python dict的最有效方法
- python - 填充numpy数组中的相邻元素
- python - 在 Windows 上编译 scikit-image 以运行测试
- angular - 子组件如何在子组件初始化时控制其自身在父组件中的可见性?
- java - 何时在 CDI 中发送 @Initialized(ApplicationScoped.class) 事件?
- php - Carbon 将天数转换为人类可读的格式
- css - 将自定义样式添加到反应中的引导类。
- python-3.x - 为未经授权的 AWS 服务用户编写 python 测试