如何使用Perl解析大型XML文件?

时间:2010-09-17 05:33:33

标签: xml perl

  

可能重复:
  Why am I getting an “Out of memory” error with Perl's XML::Simple?

我有一个像这样的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";

产生的输出是,

rrc_trans_id :: 2
plmn identity ::  1
dedicated info nas ::  07410109014290112345671000028020000f0

使用XML :: Simple的Perl代码适用于较小的XML文件(如上面的输出所示)。

但是如果XML文件很大,那么XML :: Simple无法处理,它显示错误消息Ran out of memory

我可以使用其他任何XML解析器,以便我可以像上面显示的那样访问XML文件中的元素吗?

如果有任何其他解析器可用,任何人都可以按照我为XML :: Simple执行的相同约定来举例说明。

2 个答案:

答案 0 :(得分:4)

有两种类型的XML解析器可用:

  • 读取整个XML的简单文件 将文件存入内存并生成简单 可访问的数据结构,这需要 相当大的记忆力 你会遇到更大的麻烦 文件。他们的优势在于他们 通常很容易使用。

  • 基于SAX的解析器进行处理 XML元素逐个元素。上班 用这个解析器开发者 (你!)必须注册回调 每一个有趣的元素和工作 与来自的信息 回调。每次SAX解析器 遇到一个给定的元素 执行相关的回调 你只能与...一起工作 有趣的标签而不是整体 立即归档。这个解析器保留了 内存使用率(可能)非常低 但需要更多的工作。

答案 1 :(得分:2)

如果文件很大,那么你应该使用任何基于SAX的解析器或尝试LibXML解析器。