Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re: Buggy output from XML::Twig on a Tee

by ateague (Monk)
on Feb 25, 2016 at 14:54 UTC ( [id://1156118]=note: print w/replies, xml ) Need Help??


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

Quick question: what is the desired output?

With <thing_list> or without?

Replies are listed 'Best First'.
Re^2: Buggy output from XML::Twig on a Tee
by seki (Monk) on Feb 25, 2016 at 16:45 UTC
    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.

      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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1156118]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (3)
As of 2024-04-20 15:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found