XML :: LibXML中dispose
的方法XML::DOM
是否存在等价物?
我必须解析许多XML文件,我不想有内存问题。
答案 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
将被销毁。