Как скопировать ребенка или тег в 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, Это поймает много ошибок, которые вы делаете. Вы получите ошибки, вместо того чтобы позволять создавать неизвестные переменные без вывода сообщений.

Другие вопросы по тегам