Как скопировать ребенка или тег в xml веточку по xpath?
Я новичок в xml ветке.. Мне нужно скопировать из xpath в xpath, как я могу это сделать? Я пытался какой-то метод, но он не может работать должным образом, поэтому, пожалуйста, помогите... как я могу скопировать тег из xpath в xpath в файле XML... как я могу получить эту опцию xml:: twig...
мой вклад:
<xml>
<front>
<sample>
<a>link <bo>ale</bo></a>
</sample>
</front>
<body>
<p>some text</p>
</body>
</xml>
Мне нужно скопировать тег по xpath...
from : //front/sample/
to : //body/
Мне нужен вывод как:
<xml>
<front>
<sample>
</sample>
</front>
<body>
<a>link <bo>ale</bo></a>
<p>some text</p>
</body>
</xml>
Я попробую:
use XML::Twig:
my $Tag_move = XML::Twig->new(
twig_handlers =>{
'xml' => \&Tag_Alt,
},
pretty_print => 'indented',
);
$Tag_move->parsefile(input.xml);
$Tag_move->print;
sub Tag_Alt{
my ($Tag_move, $tagm) = @_;
my @c = $tagm->findnodes('//front/sample/');
my $chi = $tagm->copy_children(@c);
$chi->paste('first_child', $tagm->findnodes('//body/'));
}
1 ответ
Кажется, у вас проблемы со скалярами и массивами. Может быть, следствие использования jQuery в прошлой жизни?;-)
В любом случае, ваш саб будет работать, если вы напишите это:
sub Tag_Alt{
my ($Tag_move, $tagm) = @_;
my @c = $tagm->findnodes('//front/sample/');
my @children= map { $_->cut_children } @c;
foreach my $child (@children) {
$child->paste('first_child', ($tagm->findnodes('//body/'))[0]);
}
}
Я бы написал это по-другому, хотя:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my @samples;
my $Tag_move = XML::Twig->new(
twig_handlers =>{ # cut and store the everything within sample
sample => sub { push @samples, $_->cut_children; },
# paste the samples within the body
body => sub { foreach my $sample (@samples)
{ $sample->paste( first_child => $_); }
},
},
pretty_print => 'indented',
empty_tags => 'expand', # otherwise the empty sample is output as <sample/>
);
$Tag_move->parsefile( "input.xml")
->print;
Кстати, сделайте себе одолжение, и используйте strict
а также warnings
, Это поймает много ошибок, которые вы делаете. Вы получите ошибки, вместо того чтобы позволять создавать неизвестные переменные без вывода сообщений.