Perl XML解析器和Expat
问题描述:
我有一个巨大的XML文件加载数据,我需要创建一个perl脚本,它将解析XML并只提取所需的数据。Perl XML解析器和Expat
我被告知使用expat,我想知道如果任何人有任何好的tutroial或关于如何使用perl和expat来解析XML的文章。
希望这对于perl来说真的很新颖。
答
通过一些包装如XML-Twig或XML-Rules间接使用expat可能会更容易。但是也可以使用来自XML-LibXML(其使用libxml而不是expat)的拉动解析器(例如XML :: LibXML :: Reader)进行解析。
答
如果真如你所说,XML文件是巨大的,并且只需要一些选定的数据,那么XML ::阅读:RS应该做的工作:它使用XML解析器::作为底层解析模块,这又使用expat来解析XML。
以下代码片段仅解析从潜在巨大的XML文件中需要的信息。它只使用的内存量小:
use strict;
use warnings;
use XML::Reader::RS;
my $rdr = XML::Reader::RS->new(\*DATA, { mode => 'branches' },
{ root => '/info/line[@cat="A"]', branch => [ '/' ] });
while ($rdr->iterate) {
my ($line) = $rdr->value;
for ($line) {
$_ = '' unless defined $_;
}
print "line = '$line'\n";
}
__DATA__
<info>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="A">Data 0000001</line>
<line cat="A">Data 0000002</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
<line cat="xyz">abc</line>
</info>
(但是,XML ::阅读:: RS是不是最快的,如果你想速度以及存储效率,那么你应该考虑使用XML解析器::直接)
您也可以考虑看的Perl模块'XML :: Simple'。我已经使用了它,并发现它对大多数XML项目非常有效。这也相当直观,易于拿起并立即开始使用。 – David
@David:XML :: Simple对于“巨大”文件并不理想。 – runrig