Согласно вашему комментарию, если вы хотите переписать файл с элементами Register
и Field
как дочерние элементы Partition
, вот что вы можете сделать:
простейшее решение, весь файл загружается в память:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $test_file= 'test.xml';
XML::Twig->new( twig_handlers => { 'Register|Field' => \&child,
},
pretty_print => 'indented',
)
->parsefile( $test_file)
->print;
sub child
{ my( $t, $child)= @_;
$child->move( last_child => $child->prev_sibling( 'Partition'));
}
Поскольку вы упомянули, что файл может быть очень большим, ниже приведена несколько более сложная версия, в которой хранятся только 2 Partition
элементов памяти (включая новые дочерние элементы первого). Когда Partition
анализируется, он использует flush_up_to
для очистки дерева, вплоть до предыдущего Partition
:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $test_file= 'test.xml';
XML::Twig->new( twig_handlers => { 'Partition' => \&parent,
'Register|Field' => \&child,
},
pretty_print => 'indented',
)
->parsefile( $test_file);
sub child
{ my( $t, $child)= @_;
$child->move( last_child => $child->prev_sibling( 'Partition'));
}
sub parent
{ my( $t, $partition)= @_;
if( my $prev_partition = $partition->prev_sibling( 'Partition'))
{ $t->flush_up_to( $prev_partition); }
}
Обратите внимание, что поскольку используется flush_up_to
, в конце анализа остальная часть дерева автоматически сбрасывается
Если вам нужно записать XML в определенный файл, вместо STDOUT, вы также можете передать дескриптор файла в flush_up_to
.