【问题标题】:Perl XML Parser and ExpatPerl XML 解析器和 Expat
【发布时间】:2012-09-10 21:51:06
【问题描述】:

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

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

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

【问题讨论】:

  • 您还可以考虑查看 perl 模块 XML::Simple。我已经使用了很多次,发现它对大多数 XML 项目都非常有效。它也相当直观,易于上手并立即开始使用。
  • @David: XML::Simple 不适合“巨大”文件。

标签: xml perl xml-parsing


【解决方案1】:

如果,如您所说,XML 文件很大并且只需要一些选定的数据,那么 XML::Reader:RS 应该可以完成这项工作:它使用 XML::Parser 作为底层解析模块,而后者又使用expat 来解析 XML。

以下代码 sn-p 仅解析来自可能巨大的 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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 2013-11-15
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      相关资源
      最近更新 更多