http://www.perlmonks.org?node_id=938961


in reply to Re: Modify XML tags
in thread Modify XML tags

Nice! One of the few cases where it makes sense to use force_end_tag_handlers_usage, Bravo!

I don't think you need the end_tag_handlers handler though, the start one should be enough. You could also flush at the end of the handler to save memory, if that's an issue (untested).

Replies are listed 'Best First'.
Re^3: Modify XML tags
by Anonymous Monk on Nov 20, 2011 at 05:53 UTC

    Yup, start_tag_handlers is enough, but the flushing has to be done from end_tag_handler

    #!/usr/bin/perl -- use strict; use warnings; use XML::Twig; my $str = <<'EOF'; <NoTe KunG="FoO" ChOp="SuEy"> <To KunG="FoO"> <Person KunG="FoO">Satan</Person> </To> <Beef KunG="FoO"><SaUsAGe KunG="FoO">is Tasty</SaUsAGe></Beef> </NoTe> EOF { my $t = XML::Twig->new( pretty_print => 'indented', force_end_tag_handlers_usage => 1, start_tag_handlers => { _all_ => sub { $_->set_tag( lc $_->tag ); if( $_->has_atts ){ my $atts = $_->atts ; $_->set_atts ({ map { lc( $_ ) => $atts->{$_} } keys %{ $atts } }); } return }, }, end_tag_handlers => { _all_ => sub { $_->flush; return }, }, ); $t->parse($str); $t->flush(); } __END__ <note chop="SuEy" kung="FoO"> <to kung="FoO"> <person kung="FoO">Satan</person> </to> <beef kung="FoO"> <sausage kung="FoO">is Tasty</sausage> </beef> </note>
Re^3: Modify XML tags
by Anonymous Monk on May 30, 2013 at 02:03 UTC

    I don't think you need the end_tag_handlers handler though, the start one should be enough. You could also flush at the end of the handler to save memory, if that's an issue (untested).

    Flushing in start_tag handler doubles the output  <note chop="SuEy" kung="FoO"></note> but end_tag_handlers => { _all_ doesn't get called at all

    so nothing gets flushed until the whole tree is parsed

    Is this by design of end_tag_handlers?