我有一个包含大量数据的巨大 XML 文件,我需要创建一个 perl 脚本来解析 XML 并仅提取所需的数据。
我被告知要使用 expat,我想知道是否有人有任何关于如何使用 perl 和 expat 解析 XML 的好的教程或文章。
希望这是有道理的,我对 perl 真的很陌生。
我有一个包含大量数据的巨大 XML 文件,我需要创建一个 perl 脚本来解析 XML 并仅提取所需的数据。
我被告知要使用 expat,我想知道是否有人有任何关于如何使用 perl 和 expat 解析 XML 的好的教程或文章。
希望这是有道理的,我对 perl 真的很陌生。
通过诸如XML-Twig或XML-Rules之类的包装器间接使用 expat 可能是最简单的。但也可以使用XML-LibXML(使用 libxml 而不是 expat)中的 XML::LibXML::Reader 之类的拉式解析器进行解析。
如果,如您所说,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)