in reply to Re: XML::Twig outputting root element start tag twice
in thread XML::Twig outputting root element start tag twice

Why is the output filehandle not in scope? If it is available when you create the twig, you should be able to use it in the handlers (you can use a closure to pass it to the handlers). You could also use select to send all output to the filehandle, even though I would consider not so good for the maintenability of the code.

Finally, if you are using the latest version of XML::Twig, you don't need the final flush, it's done automagically.

  • Comment on Re^2: XML::Twig outputting root element start tag twice

Replies are listed 'Best First'.
Re: XML::Twig outputting root element start tag twice
by benizi (Hermit) on Apr 25, 2006 at 15:20 UTC

    Hey, sorry for the slow response. I left for a vacation shortly after I posted my question. The filehandle is not in scope because the handlers are defined in a module and passed to the twig like this: (paraphrased)

    ... use Handlers::Library qw/:handlers/; ... open my $filehandle, '>', 'output.xml' or die ">output.xml:$!"; my $p = XML::Twig->new( twig_handlers => { foo => \&foo_handler }, );

    I'm going to end up doing what I was trying to avoid in the first place: passing a filehandle to all of the ->flush calls. When I asked the original question, I figured this was something XML::Twig would naturally support. (It's wonderfully DWIMmy, and does something similar for defaulting a filehandle with twig_print_outside_roots => $filehandle, but I didn't realize that that was just a select.)

    So, long story short, my final code will be something like: (untested)

    package Handlers::Library; my $twig_fh; BEGIN { $twig_fh = *STDOUT; } sub twig_output { my $name = shift; open $twig_fh, '>', $name or die ">$name: $!"; } sub foo_handler { ... $twig->flush($twig_fh) } sub bar_handler { ... $twig->flush($twig_fh) }
    use Handlers::Library qw/:handlers/; twig_output('output.xml'); my $p = XML::Twig->new(...);