Я пытаюсь изменить текст трех элементов из исходного XML-файла.
Две цели имеют одинаковое имя элемента (ifw6:value
), но существуют под разными заголовками.Третий имеет имя элемента, отличное от первых двух.
Программа успешно выполняется, но печатает исходный файл XML без каких-либо изменений.Операторы отладки заставляют меня поверить, что это не выполняет подпрограмму, сопоставленную с twig_handlers
.
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $text1 = "123456789";
my $text2 = "1234567";
my $text3 = "001";
my $twig = XML::Twig->new(
pretty_print => 'indented',
twig_handlers => {
text => sub {
my $targ1_2 = $_->next_elt('ifw6:value');
my $targ3 = $_->next_elt('ifw4:relationship');
if ($targ1_2->text eq 'target1') {
$targ1_2->set_text($text1);
}
if ($targ1_2->text eq 'target2') {
$targ1_2->set_text($text2);
}
if ($targ3->text eq 'target3') {
$targ3->set_text($text3);
}
$targ1_2->flush;
$targ3->flush;
}
}
);
$twig->parsefile('text.xml');
$twig->print();
text.xml
<SOAP-ENV>
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ifw:Information>
<requestHeader>
<ifw1:id/>
</requestHeader>
<ifw4:Miscellaneous>
<ifw6:MiscVals xsi:type="type1">
<ifw6:value>target1</ifw6:value>
</ifw6:MiscVals>
<ifw6:MiscVals xsi:type="type2">
<ifw6:Vals xsi:type="type3">
<ifw6:value>target2</ifw6:value>
</ifw6:Vals>
</ifw6:MiscVals>
<ifw4:relationship>target3</ifw4:relationship>
</ifw4:Miscellaneous>
</ifw:Information>
</SOAP-ENV:Body>
</SOAP-ENV>
желаемый результат
<SOAP-ENV>
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ifw:Information>
<requestHeader>
<ifw1:id/>
</requestHeader>
<ifw4:Miscellaneous>
<ifw6:MiscVals xsi:type="type1">
<ifw6:value>123456789</ifw6:value>
</ifw6:MiscVals>
<ifw6:MiscVals xsi:type="type2">
<ifw6:Vals xsi:type="type3">
<ifw6:value>1234567</ifw6:value>
</ifw6:Vals>
</ifw6:MiscVals>
<ifw4:relationship>001</ifw4:relationship>
</ifw4:Miscellaneous>
</ifw:Information>
</SOAP-ENV:Body>
</SOAP-ENV>