Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re: Passing parameters for XML::twig handler

by mirod (Canon)
on Apr 27, 2011 at 08:27 UTC ( #901497=note: print w/ replies, xml ) Need Help??


in reply to Passing parameters for XML::twig handler

In order to pass arguments to a handler you need to use a closure:

parse_xml( $xmlfile); sub parse_xml { my( $file)= @_; my $ups_able_info= []; my $twig1 = XML::Twig->new( twig_handlers => { 'ups:TABLE_INFO/ups:field' => sub { parse +_table_info( @_, $ups_able_info); } ) ->parsefile( $file); # now $ups_table_info is filled } sub parse_table_info { my( $twig, $table_info, $ups_able_info)= @_; # note the extra argu +ment my $table_column = {}; $table_column->{$table_info->field('ups:tag')} = $table_info->fie +ld('ups:ui_name'); push(@{$ups_table_info}, $table_column); }

A good introduction to closures in Perl: Achieving closure by Simon Cozens

Also, I made a few cosmetic changes to your code, mostly to make it look a bit more modern:

  • no need for the & before a function name,
  • you mix camel case (parseXml) and underscore separated (parse_table_info) names, pick one scheme and stick to it (also, I hate camelCase ;--)
  • to me my $ups_able_info= []; is a lot more readable than my( $ups_able_info)= ([]);
  • use the XML::Twig->new syntax instead of the old, and potentially dangerous, new XML::Twig
  • I added the call to parsefile, to actually parse the file,
  • I usually write $elt->field( 'foo') instead of the longer $elt->first_child_text( 'foo') (even if it takes me longer to type because I usually type filed first, then go back and fix it ;--(

Also, you data structure seems a bit weird to me, but maybe it makes sense, I don't have enough detail to tell. $ups_table_info will end up looking something like [ { ui_tag => "val" }, {ui_another_tag => "val2"}, ...],, which doesn't look like the easiest to use data.


Comment on Re: Passing parameters for XML::twig handler
Select or Download Code

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (8)
As of 2015-07-04 15:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (60 votes), past polls