在XML::LibXML中是否有与XML::DOM::Node::dispose等价的方法?



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

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

我不能为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跟踪哪些元素需要打开/关闭,所以如果你从处理程序中刷新,你不必担心任何事情。每次你画完一个子树的时候都要不断地冲洗树枝,这样就会得到格式良好的树。在整个解析之后,不要忘记再冲洗一次以打印文档的末尾。文档类型和实体声明也被打印出来。

您可以简单地调用$node->unbindNode并删除对节点及其任何子节点、子属性等的所有引用。然后内部的xmlNode将被破坏。

没有显式释放内存的机制,因为它会自动尽快发生。当放弃对资源的引用时,资源会自动释放。使用适当作用域的变量,你就不会有问题了。


如果你真的想要修剪一个文档树(虽然我不明白为什么),你可以使用下面的命令从树中删除一个节点:

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

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

相关内容

  • 没有找到相关文章

最新更新