【问题标题】:How can I parse large XML files with Perl? [duplicate]如何使用 Perl 解析大型 XML 文件? [复制]
【发布时间】:2010-09-18 18:10:37
【问题描述】:

可能重复:
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 遵循的相同约定来举例说明。

【问题讨论】:

  • 您已经在stackoverflow.com/questions/3726197/… 提出过这个问题——请重新阅读那里给出的建议。
  • 但我问的方式不清楚,这就是为什么我再次询问确切的场景
  • 所以编辑您的原始问题以澄清。不要向网站发送垃圾邮件。

标签: xml perl


【解决方案1】:

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

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

  • 基于 SAX 的解析器处理 逐个元素的 XML 元素。去工作 有了这个解析器,开发人员 (你!)必须注册回调 每一个有趣的元素和作品 与来自的信息 回调。每次 SAX 解析器 遇到给定的元素 相关的回调被执行并且 您只能使用 有趣的标签而不是整体 一次归档。这个解析器保持 内存使用(可能)非常低 但实际上需要更多的工作。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2015-05-16
      • 2011-05-09
      • 2010-12-10
      相关资源
      最近更新 更多