2015-06-05 5 views
0

Существует ли эквивалент метода dispose из XML::DOM в XML :: LibXML?Есть ли эквивалент XML :: DOM :: Node :: dispose в XML :: LibXML?

Мне нужно разобрать много файлов XML, и я не хочу иметь проблемы с памятью.

+0

Не должно быть необходимости явно удалять ваш XML-документ. Ты это пробовал? Нет смысла фиксировать мнимые проблемы – Borodin

ответ

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> 

Примечание - это наглядный пример - это не особенно полезная вещь, чтобы сделать, потому что вы печатаете «элементы» и отбрасывание «корня». Но это более полезно, если вы извлекаете информацию из своего XML.

Также интерес представляет flush метод, который, вероятно, более актуально, если вы делаете выше:

Очищает прутик до (включительно) текущего элемента, затем удаляет все ненужные элементы из дерево, которое хранится в памяти. flush отслеживает, какие элементы должны быть открытыми/закрытыми, поэтому, если вы скрылись от обработчиков, вам не нужно ни о чем беспокоиться. Просто продолжайте промывать веточку каждый раз, когда вы закончите с поддеревом, и оно получится хорошо сформированным. После того, как весь синтаксический анализ не забудьте снова очистить документ, чтобы распечатать конец документа. Также печатаются декларации doctype и entity.

0

Не существует механизма для явного освобождения памяти, поскольку это происходит автоматически как можно скорее. Ресурсы автоматически освобождаются, так как ссылки на них отчисляются. Используйте правильные переменные, и все будет в порядке.


Если вы действительно хотите обрезать дерево документа (хотя я не понимаю, почему), вы можете использовать следующие для удаления узла из дерева:

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

Узел (и его дети) будут освобождены, когда последняя ссылка на него исчезнет. Обычно это происходит, как только $node выходит за рамки.

0

Вы можете просто позвонить $node->unbindNode и удалить все ссылки на узел и любые его дочерние элементы, дочерние атрибуты и т. Д.. Затем будет уничтожен внутренний xmlNode.

 Смежные вопросы

  • Нет связанных вопросов^_^