Perl XML Parser和Expat

时间:2012-09-18 15:34:56

标签: xml perl xml-parsing

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

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

希望这对perl来说真的很新。

2 个答案:

答案 0 :(得分:3)

通过XML-TwigXML-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)