编辑::
大家好,
我有一个像这样的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>
Run Code Online (Sandbox Code Playgroud)
我使用像这样的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";
Run Code Online (Sandbox Code Playgroud)
产生的输出是,
rrc_trans_id :: 2
plmn identity :: 1
dedicated info nas :: 07410109014290112345671000028020000f0
Run Code Online (Sandbox Code Playgroud)
使用XML :: Simple的Perl代码适用于较小的XML文件(如上面的输出所示).
但是如果XML文件很大,那么XML :: Simple无法处理,它显示错误消息Ran out of memory.
我的问题是,我可以使用任何其他XML解析器,以便我可以像上面显示的类似方式访问XML文件中的元素???
如果有任何其他解析器可用,任何人都可以按照我为XML :: Simple执行的相同约定来举例说明.
请帮助我,我正在努力解决这个问题
Cha*_*ens 11
如果没有能够看到代码或代表性的例子,我可以减少猜测.我敢打赌,XML文件非常庞大,而且你在尝试存储数据结构时内存不足.切换到类型的流式XML解析器XML::Twig.
通常,巨大的XML文件将是一组记录,您最终只是循环遍历您构建的数据结构.更好,更快的方法是随时处理文件:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
sub process_record {
my $rec = shift;
print "@{$rec}{qw/field1 field2 field3/}\n";
}
my $t = XML::Twig->new(
twig_handlers => {
record => sub {
my ($t, $elt) = @_;
my %record = map {
$_ => $elt->first_child($_)->text
} qw/field1 field2 field3/;
process_record(\%record);
#get rid of any memory that is being held
$t->purge;
},
}
);
$t->parse(\*DATA);
__DATA__
<root>
<record>
<field1>1</field1>
<field2>a</field2>
<field3>foo</field3>
</record>
<record>
<field1>2</field1>
<field2>b</field2>
<field3>bar</field3>
</record>
<record>
<field1>3</field1>
<field2>c</field2>
<field3>baz</field3>
</record>
</root>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1541 次 |
| 最近记录: |