in reply to Re: Buggy output from XML::Twig on a Tee
in thread Buggy output from XML::Twig on a Tee

While dispatching the <thing> elements between the two files, I would expect each one being well formed, i.e. having both opening and closing tags for <thing_list> with perhaps no child elements inside.
  • Comment on Re^2: Buggy output from XML::Twig on a Tee

Replies are listed 'Best First'.
Re^3: Buggy output from XML::Twig on a Tee
by ateague (Monk) on Feb 25, 2016 at 17:27 UTC

    Pretty much what Ikegami said on SO. You can see the order that the twigs and residual tags are being processed by modfying the code as follows:

    use XML::Twig; use IO::Tee; use feature 'say'; open my $frufile, '>', 'fruit.xml' or die "fruit $!"; open my $vegfile, '>', 'veg.xml' or die "veg $!"; my $tee = IO::Tee->new($frufile, $vegfile); select $tee; my $twig=XML::Twig->new( twig_handlers => { thing => \&magic, _default_ => sub { print '_default_ for '.$_->name." [[["; $_[0]->flush($tee); #default filehandle = tee say "]]]"; 1; }, }, pretty_print => 'none', empty_tags => 'normal', ); $twig->parse( *DATA ); sub magic { my ($thing, $element) = @_; print "magic for ". $element->{att}{type}." [[["; for ($element->{att}{type}) { if (/fruit/) { $thing->flush($frufile); } elsif (/vegetable/) { $thing->flush($vegfile); } else { $thing->purge; } } say "]]]"; 1; } __DATA__ <batch> <header> <foo>1</foo> <bar>2</bar> <baz>3</baz> </header> <thing_list> <thing type="fruit" >Im an apple!</thing> <thing type="city" >Toronto</thing> <thing type="vegetable" >Im a carrot!</thing> <thing type="city" >Melrose</thing> <thing type="vegetable" >Im a potato!</thing> <thing type="fruit" >Im a pear!</thing> <thing type="vegetable" >Im a pickle!</thing> <thing type="city" >Patna</thing> <thing type="fruit" >Im a banana!</thing> <thing type="vegetable" >Im an eggplant!</thing> <thing type="city" >Taumatawhakatangihangakoauauotamateaturipuk +akapikimaungahoronukupokaiwhenuakitanatahu</thing> </thing_list> <trailer> <chrzaszcz>A</chrzaszcz> <zdzblo>B</zdzblo> </trailer> </batch>

    Fruit.xml:

    _default_ for foo[[[<batch><header><foo>1</foo>]]] _default_ for bar[[[<bar>2</bar>]]] _default_ for baz[[[<baz>3</baz>]]] _default_ for header[[[</header>]]] magic for fruit [[[<thing_list><thing type="fruit">Im an apple!</thing +>]]] magic for city [[[]]] magic for vegetable [[[]]] magic for city [[[]]] magic for vegetable [[[]]] magic for fruit [[[<thing type="fruit">Im a pear!</thing>]]] magic for vegetable [[[]]] magic for city [[[]]] magic for fruit [[[<thing type="fruit">Im a banana!</thing>]]] magic for vegetable [[[]]] magic for city [[[]]] _default_ for thing_list[[[</thing_list>]]] _default_ for chrzaszcz[[[<trailer><chrzaszcz>A</chrzaszcz>]]] _default_ for zdzblo[[[<zdzblo>B</zdzblo>]]] _default_ for trailer[[[</trailer>]]] _default_ for batch[[[</batch>]]]

    Veg.xml

    _default_ for foo[[[<batch><header><foo>1</foo>]]] _default_ for bar[[[<bar>2</bar>]]] _default_ for baz[[[<baz>3</baz>]]] _default_ for header[[[</header>]]] magic for fruit [[[]]] magic for city [[[]]] magic for vegetable [[[<thing type="vegetable">Im a carrot!</thing>]]] magic for city [[[]]] magic for vegetable [[[<thing type="vegetable">Im a potato!</thing>]]] magic for fruit [[[]]] magic for vegetable [[[<thing type="vegetable">Im a pickle!</thing>]]] magic for city [[[]]] magic for fruit [[[]]] magic for vegetable [[[<thing type="vegetable">Im an eggplant!</thing> +]]] magic for city [[[]]] _default_ for thing_list[[[</thing_list>]]] _default_ for chrzaszcz[[[<trailer><chrzaszcz>A</chrzaszcz>]]] _default_ for zdzblo[[[<zdzblo>B</zdzblo>]]] _default_ for trailer[[[</trailer>]]] _default_ for batch[[[</batch>]]]

    Notice how the "<thing>" handler gets called after the tag is closed and flushes any other previous, unprocessed tag information before it.