in reply to XML::Twig - extracting some tags from siblings

You can't do that with a simple condition. The simplest is probably to do something like (untested):

my @sheads= $t->root->children( 'shead'); foreach my $shead (@sheads) { my $aheadtext= $shead->wrap_in( 'aheadtext'); my $more_text= $aheadtext->next_sibling; while( $more_text->tag ne 'shead') { $more_text->move( last_child => $aheadtext); $more_text= $aheadtext->next_sibling; } }

Replies are listed 'Best First'.
Re^2: XML::Twig - extracting some tags from siblings
by aakikce (Acolyte) on Jun 05, 2007 at 14:57 UTC

    Hi Mirod,

    Thanks for your reply. what you have given is exactly correct.

    But I am struggling with the 'while' loop. I tested with the 'if' loop many times, it runs properly. In 'while' loop I get error as can't call method tag.

    if ($more_text->tag ne "ahead") { $more_text->move(last_child => $aheadtext); $more_text = $aheadtext->next_sibling; } if ($more_text->tag ne "ahead") { $more_text->move(last_child => $aheadtext); $more_text = $aheadtext->next_sibling; }

    Can you please explain.

    thanks,

    AAkikce

      I told you it was untested! ;--)

      Of course at some point you get to the last child, and $aheadtext->next_sibling; doesn't exist, so $more_text becomes undef.

      So the test should not be while( $more_text->tag ne 'shead'), which will die when you trying to call the tag method on the undef value in $more_text, but while( $more_text && ($more_text->tag ne 'shead')).

      Does that help?