【问题标题】:Is there an equivalent to XML::DOM::Node::dispose in XML::LibXML?XML::LibXML 中是否有等效于 XML::DOM::Node::dispose 的东西?
【发布时间】:2015-06-05 09:59:30
【问题描述】:

在 XML::LibXML 中是否存在与 XML::DOM 的方法 dispose 等效的方法?

我要解析很多 XML 文件,我不想出现内存问题。

【问题讨论】:

  • 应该不需要显式处理您的 XML 文档。你试过了吗?解决想象中的问题是没有意义的

标签: perl xmldom xml-libxml xml


【解决方案1】:

我不能代表XML::LibXML,但XML::Twig 肯定有purge 方法。这对于大型 XML 文档很有用,因此您可以丢弃您可能已经处理过的“已处理”数据。

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

sub print_and_purge {
   my ( $twig, $element ) = @_; 
    ##do something with this element

   print "-----\n";
   $element -> print;
   print "-----\n";

   $twig -> purge; 
}

my $twig = XML::Twig -> new ( 'twig_handlers' => { 'element' => \&print_and_purge },
                              'pretty_print' => 'indented' ); 

 $twig -> parse ( \*DATA );

 __DATA__
 <root>
     <element>fish</element>
     <element>
        <subelement>content</subelement>
     </element>
     <element/>
 </root>

注意 - 这是一个说明性示例 - 这不是一件特别有用的事情,因为您正在打印“元素”并丢弃“根”。但如果您从 XML 中提取信息,它会更有用。

flush 方法也很有趣,如果您执行上述操作,它可能更相关:

将树枝刷新到(包括)当前元素,然后从保存在内存中的树中删除所有不必要的元素。 flush 跟踪哪些元素需要打开/关闭,所以如果你从处理程序中刷新,你不必担心任何事情。每次完成子树后,只需继续冲洗树枝,它就会形成良好的形状。在整个解析之后不要忘记再刷新一次以打印文档的末尾。文档类型和实体声明也会被打印出来。

【讨论】:

    【解决方案2】:

    您可以简单地调用$node-&gt;unbindNode 并删除对节点的所有引用及其任何子节点、子属性等。那么内部的xmlNode就会被销毁。

    【讨论】:

      【解决方案3】:

      没有显式释放内存的机制,因为它会尽快自动发生。当放弃对资源的引用时,资源会自动释放。使用适当范围的变量,你会没事的。


      如果您确实想要修剪文档树(虽然我不明白为什么),您可以使用以下命令从树中删除节点:

      $node->parentNode->removeChild($node);
      

      当最后一个对它的引用消失时,该节点(及其子节点)将被释放。通常,这是在 $node 超出范围时立即发生的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-28
        • 2016-11-01
        • 2023-03-21
        相关资源
        最近更新 更多