twig_handlers
- это IMO, одна из особенностей XML::Twig
, которая удивительна, но и излишне запутана.
Я бы предложил , а не , используя его, если только вам не нужно постепенно анализировать или предварительно обрабатывать XML.
Так что я бы решил вашу проблему более похожей this:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $xml = XML::Twig -> new ->parsefile('applying.xml');
#get_xpath finds all characteristics nodes in the tree, and allows you to
#iterate. "//" means any depth.
foreach my $element ( $xml -> get_xpath('//characteristics') ) {
$element -> insert_new_elt ( 'last_child' => 'supportsMVV') -> set_text('true');
}
$xml -> set_pretty_print('indented');
$xml -> print;
Он использует get_xpath
для обхода дерева XML и поиска всех узлов characteristics
, прежде чем изменять каждый из них. Я чувствую, что это одновременно чище и менее запутанно.
Вы также можете использовать xpath
для проверки условий в вашем XML, так как XPath
является довольно всеобъемлющим способом интерпретации документа XML. Или просто сделайте это «perlishly» внутри повторяющегося элемента.
В любом случае, причина, по которой вы не видите, что ваша вещь меняется, заключается в том, что вы фактически не записываете изменения - $xml -> print;
изменяет файл, только если вы делаете parsefile_inplace
.
Но я бы посоветовал вам не делать этого - просто сохраните копию вашего вывода.
Например:
open ( my $output, ">", "applying.new.xml" ) or die $!;
$xml -> print ( $output );