xml - 清除子处理程序中的 XML Twig

标签 xml perl xml-twig

我正在使用 XML::Twig 解析大型 XML 文件 (60GB+)并在 OO (Moose) 脚本中使用它。我正在使用 twig_handlers 选项在元素被读入内存后立即对其进行解析。但是,我不确定如何处理 Element 和 Twig。

在我使用 Moose(和 OO 一起)之前,我的脚本如下所示(并且有效):

my $twig = XML::Twig->new(
  twig_handlers => {
    $outer_tag => \&_process_tree,
  }
);
$twig->parsefile($input_file);


sub _process_tree {
  my ($fulltwig, $twig) = @_;

  $twig->cut;
  $fulltwig->purge;
  # Do stuff with twig
}

现在我会这样做。

my $twig = XML::Twig->new(
  twig_handlers => {
    $self->outer_tag => sub {
      $self->_process_tree($_);
    }
  }
);
$twig->parsefile($self->input_file);

sub _process_tree {
  my ($self, $twig) = @_;

  $twig->cut;
  # Do stuff with twig
  # But now the 'full twig' is not purged
}

问题是我现在发现我错过了 fulltwig 的清除。我认为 - 在第一个非 OO 版本中 - 清除将有助于节省内存:尽快摆脱 fulltwig。但是,当使用 OO 时(并且必须依赖处理程序中的显式 sub{}),我看不到如何清除完整的 Twig ,因为文档说

$_ is also set to the element, so it is easy to write inline handlers like

para => sub { $_->set_tag( 'p'); }

所以他们谈论的是您要处理的元素,而不是 fulltwig 本身。那么,如果它没有传递给子例程,我该如何删除呢?

最佳答案

处理程序仍然获得完整的 Twig ,您只是没有使用它(而是使用 $_)。

事实证明,您仍然可以在 Twig 上调用 purge(我在文档中通常将其称为“元素”或 elt):$_ ->purge 将按预期工作,将整个 Twig 清除到 $_ 中的当前元素;

更简洁(恕我直言)的方法是实际获取所有参数并明确清除整个 Twig :

my $twig = XML::Twig->new(
  twig_handlers => {
    $self->outer_tag => sub {
      $self->_process_tree(@_); # pass _all_ of the arguments
    }
  }
);
$twig->parsefile($self->input_file);

sub _process_tree {
  my ($self, $full_twig, $twig) = @_; # now you see them!

  $twig->cut;
  # Do stuff with twig
  $full_twig->purge;  # now you don't
}

关于xml - 清除子处理程序中的 XML Twig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45263553/

相关文章:

c# - 根级别的数据无效

perl - 如何在 Perl 中重命名导出函数?

perl:打开文件句柄,写入其中,稍后给它命名?

xml - 我希望 XML::Twig 准确地打印出解析的内容

xml - 如何使用 Perl 的 XML::Twig 删除元素?

python - 使用pyspark从本地系统读取文件时获取文件名

Java - 保存 XML 后保留空格

java - 在android中运行方法onclick崩溃

perl - 如何通过线程在perl中同时执行两个函数?

xml - 使用 Perl XML::Twig 处理程序处理大文件的内存使用效率低下