如何使用Perl解析大型XML文件?
问题描述:
可能重复:
Why am I getting an “Out of memory” error with Perl's XML::Simple?如何使用Perl解析大型XML文件?
我有这样一个XML文件:
<message>
<c1>
<rrcConnectionSetupComplete>
<rrc-TransactionIdentifier>2</rrc-TransactionIdentifier>
<criticalExtensions>
<c1>
<rrcConnectionSetupComplete-r8>
<selectedPLMN-Identity> 1 </selectedPLMN-Identity>
<dedicatedInfoNAS> 07410109014290112345671000028020000f0 </dedicatedInfoNAS>
</rrcConnectionSetupComplete-r8>
</c1>
</criticalExtensions>
</rrcConnectionSetupComplete>
</c1>
</message>
我使用这样的Perl代码访问XML文件中的数据(我应该坚持这种访问格式)
#!/usr/bin/perl
use strict;
use XML::Simple;
my $xml = new XML::Simple;
my $data = $xml->XMLin("uL-DCCH-Message.xml");
my $rrc_trans_identifier = $data->{'c1'}->{'rrcConnectionSetupComplete'}->{'rrc-TransactionIdentifier'};
print "rrc_trans_id :: $rrc_trans_identifier\n";
my $selected_plmn_id = $data->{c1}->{rrcConnectionSetupComplete}->{criticalExtensions}->{c1}->{'rrcConnectionSetupComplete-r8'}->{'selectedPLMN-Identity'};
print "plmn identity :: $selected_plmn_id\n";
my $rrc_dedicated_info_nas = $data->{c1}->{rrcConnectionSetupComplete}->{criticalExtensions}->{c1}->{'rrcConnectionSetupComplete-r8'}->{dedicatedInfoNAS};
print "dedicated info nas :: $rrc_dedicated_info_nas\n";
产生的输出是,使用XML ::简单工作正常对于较小的XML文件(如图所示在上述输出)
rrc_trans_id :: 2
plmn identity :: 1
dedicated info nas :: 07410109014290112345671000028020000f0
Perl代码。
但是,如果XML文件很大,那么XML :: Simple将无法处理,并显示错误消息Ran out of memory
。
是否有任何其他XML解析器可以使用,以便我可以像上面所显示的类似方式访问XML文件中的元素?
如果还有其他解析器可用,是否可以通过遵循与XML :: Simple相同的约定来给出示例。
答
有两种类型的XML解析器:
简单那些读取整个XML 文件到内存中,并生成一个简单的 访问的数据结构,这需要 一个相当大的数量的内存,使 你会遇到更大的 文件的问题。他们的优势在于他们通常很容易处理。
这是基于SAX的解析器,它按元素处理XML元素 。要使用此解析器工作 ,开发人员 (您!)必须为每个感兴趣的元素注册 的回调,并使用 回调中的信息注册 。每当SAX解析器 遇到给定元素时,将执行 关联回调,并且 您只能同时使用 感兴趣的标记而不是整个 文件。这个解析器保持 内存使用(可能)非常低,但需要更多的工作。
你已经问过这个在http://*.com/questions/3726197/why-am-i-getting-an-out-of-memory-error-with-perls-xmlsimple - 请重新 - 读你在那里得到的建议。 – Ether 2010-09-17 05:41:44
但我以不明确的方式提出这个问题,这就是为什么我再一次询问确切的场景 – 2010-09-17 06:00:50
所以编辑你的原始问题来澄清。不要垃圾网站。 – Ether 2010-09-17 06:30:09