Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: XML::Twig outputting root element start tag twice

by benizi (Hermit)
on Apr 18, 2006 at 19:06 UTC ( [id://544156]=note: print w/replies, xml ) Need Help??


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

Explicitly adding the $outfh is part of what I was avoiding, as it's not in the scope of the actual handlers in the real-life example. (XML::Twig has so much DWIMmery, I assumed specifying an output filehandle would be something pretty trivial.)

As to the formatting, it's because, while I'm using XML::Twig, other people in the project aren't (yet!), and the line-based -ness of the format is easier for them to handle. (Plus, I simply prefer the aesthetics of it.)

Replies are listed 'Best First'.
Re^2: XML::Twig outputting root element start tag twice
by mirod (Canon) on Apr 19, 2006 at 06:06 UTC

    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.

      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(...);

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (6)
As of 2024-03-28 11:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found