在XML :: LibXML中是否存在XML :: DOM :: Node :: dispose的等价物?

时间:2015-06-05 09:59:30

标签: perl xmldom xml-libxml xml

XML :: LibXML中dispose的方法XML::DOM是否存在等价物?

我必须解析许多XML文件,我不想有内存问题。

3 个答案:

答案 0 :(得分:0)

我无法代表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>

注意 - 这是一个说明性的例子 - 它并不是一件特别有用的事情,因为你要打印这些元素&#39;并丢弃&#39; root&#39;。但是,如果您从XML中提取信息,那么它会更有用。

同样令人感兴趣的是flush方法,如果您正在执行上述操作,这可能更为重要:

  

将一个树枝刷新到(并包括)当前元素,然后从树中保留在内存中的所有不必要元素。 flush记录了哪些元素需要打开/关闭,所以如果你从处理程序中冲洗,你不必担心任何事情。每次你完成一个子树时,只要一直冲洗树枝,它就会形成良好的状态。在整个解析之后,不要忘记再次打印文档的结尾。还会打印doctype和实体声明。

答案 1 :(得分:0)

没有明确释放内存的机制,因为它会尽快自动发生。资源会自动释放,因为放弃了对它们的引用。使用正确范围的变量,你就可以了。

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

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

当最后一次引用消失时,节点(及其子节点)将被释放。通常,只要$node超出范围,就会这样。

答案 2 :(得分:0)

您只需调用$node->unbindNode并删除对节点及其任何子节点,子属性等的所有引用。然后内部xmlNode将被销毁。