in reply to Re: Moving elements with XML::Twig: Document root closing tag is duplicated on output -- solution
in thread [SOLVED] Moving elements with XML::Twig: Document root closing tag is duplicated on output

Pretty much what Tanktalus said earlier. This code is a vastly simplified example piece that reproduces the issue in question. I tried to trim out as much unnecessary cruft to make the example as small and concise as possible while still remaining relevant

In answer to some of your questions:

  1. the way you set up the handler made me immediatly suspicious.

    the live code has some additional processing that happens after the twig is processed. It would look something like the following simplified example:

    sub { my $local_state = _move(@_); $global_state = _do_stuff_with_local_state($local_state->{SUMMARY}, \%VARS);  1; },
  2. The, perfectly correct and valid, style to call a sub with &subname

    Correct. The actual code passes extra variables to the twig processing subroutine in addition to the default TWIG and ELEMENT variables passed to the handler:

    sub { _move(@_, $local_state, \%OPTIONS, $warning_flag); 1; },
  3. For the rest I can say that, also you have an unneeded 1; as last thing in your sub.

    Pretty much what Tanktalus said earlier.

    The function called by the handler returns '1' in my simplified example (instead of variables) because it is an explicit 'true' return value

    The anonymous sub returns '1' because there are multiple twig handlers that may apply to a given twig:

    '/shipment/box' => sub { _move(@_); 1; }, '/shipment/box[@location='Vault_111']' => sub { _moveAgain(@_); 1; },

Hope that clarifies things.

  • Comment on Re^2: Moving elements with XML::Twig: Document root closing tag is duplicated on output -- solution
  • Select or Download Code

Replies are listed 'Best First'.
Re^3: Moving elements with XML::Twig: Document root closing tag is duplicated on output -- further comments
by Discipulus (Canon) on Feb 23, 2016 at 08:35 UTC
    yes clarify enough..

    I see you have more experience that me. I just tried to bypass the unwanted behaviour cleaning as much as possible your code.

    As for my first sentence i dunno what happen with your code. Anyway i msgd also the XML::Twig author about the possibility to spend some spare time with this problem.

    Anyway the general advise of keep things simple is still valid. A stream of XML and the parser involved is something that can block even rough stomachs, at least mine. I'm sure (at this point) that you read carefully the docs, but in the part dedicated to twig_handlers is declared:

    Warning: if you have used purge or flush on the twig the element might not be complete, some of its children might have been entirely flushed or purged, and the start tag might even have been printed (by flush) already, so changing its gi might not give the expected result.

    that might be relevant in your case.

    Have you noticed that changing $_[0]->flush(); to $_[0]->print(); in the sub does not provoke the unwanted behaviour?

    But in the docs is said that print must be used AFTER the parse, so I've commented it in the sub and I've added it after the safe_parse $working_xml->print(); and $broken_xml->print(); respectively: the bad doubled closing tag does not appears anymore.

    Share your further discoveries and good luck.

    L*

    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.