0

我有一个包含大量数据的巨大 XML 文件,我需要创建一个 perl 脚本来解析 XML 并仅提取所需的数据。

我被告知要使用 expat,我想知道是否有人有任何关于如何使用 perl 和 expat 解析 XML 的好的教程或文章。

希望这是有道理的,我对 perl 真的很陌生。

4

2 回答 2

3

通过诸如XML-TwigXML-Rules之类的包装器间接使用 expat 可能是最简单的。但也可以使用XML-LibXML(使用 libxml 而不是 expat)中的 XML::LibXML::Reader 之类的拉式解析器进行解析。

于 2012-09-18T16:15:34.477 回答
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)

于 2014-08-20T11:13:34.127 回答