Как вставить дочернюю веточку xml
Мне нужно вставить дочерний элемент в дочерний элемент. У меня есть два ребенка, первый ребенок вырезать и вставить, второй ребенок вставить как первый ребенок.
XML:
<fn id="fn1_1">
<label>1</label>
<p>The distinguished as &#x2018;bisexuation.&#x2019;</p>
</fn>
Я старался
sub fngroup{
my ($xml_twig_content, $fn_group) = @_;
@text = $fn_group->children;
my $cut;
foreach my $fn (@text){
$cut = $fn->cut if ($fn->name =~ /label/);
if ($fn =~ /p/){
$fn->paste('first_child', $cut);
}
}
}
Я не могу это обработать. Как я могу вырезать метку и тег метки вставить в тег p как first_child.
Я нуждаюсь:
<fn id="fn1_1">
<p><label>1</label> The distinguished as &#x2018;bisexuation.&#x2019;</p>
</fn>
1 ответ
Решение
Есть несколько проблем с вашим кодом: сначала обработчик должен быть применен к fn
не fngroup
тогда вы тестируете $fn =~ /p/
вместо $fn->name =~ /p/
,
Так что это будет работать:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
XML::Twig->new( twig_handlers => { fn => \&fn})
->parse( \*DATA)
->print;
sub fn {
my ($xml_twig_content, $fn) = @_;
my @text = $fn->children;
my $cut;
foreach my $fn (@text){
$cut = $fn->cut if ($fn->name =~ /label/);
if ($fn->name =~ /p/){
$cut->paste(first_child => $fn);
}
}
}
__DATA__
<foo>
<fngroup>
<fn id="fn1_1">
<label>1</label>
<p>The distinguished as &#x2018;bisexuation.&#x2019;</p>
</fn>
</fngroup>
</foo>
Это излишне сложно, хотя. Почему бы не обработчик быть просто:
sub fn {
my ($twig, $fn) = @_;
$fn->first_child( 'label')->move( first_child => $fn->first_child( 'p'));
}