我有一个包含大量数据的巨大XML文件,我需要创建一个perl脚本来解析XML并仅提取所需的数据。
我被告知使用expat,我想知道是否有任何人有关于如何使用perl和expat来解析XML的任何好的tutroial或文章。
希望这对perl来说真的很新。
答案 0 :(得分:3)
通过XML-Twig或XML-Rules这样的包装器间接使用expat可能是最简单的。但是也可以使用来自XML-LibXML的XML :: LibXML :: Reader等拉解析器进行解析(使用libxml而不是expat)。
答案 1 :(得分:0)
如果你说的那样,XML文件很庞大,只需要一些选定的数据,那么XML :: Reader:RS就可以完成这项工作:它使用XML :: Parser作为底层解析模块,而后者又使用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 :: Reader :: RS不是最快的,如果你想要速度和内存效率,那么你应该考虑直接使用XML :: Parser)