Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: TWig handler generation -- dispatch table

by Discipulus (Abbot)
on Feb 01, 2019 at 17:04 UTC ( #1229248=note: print w/replies, xml ) Need Help??


in reply to TWig handler generation

Hello nico38100

A dispatch table is useful as an hash reference is the only think the twig_handler wants:

use strict; use warnings; use XML::Twig; my %dispatch = ( # <-- build it.. to => sub {$_->delete;}, from => sub {$_->set_text( uc($_->trimmed_text) ); $_->flush}, ); my $twig=XML::Twig->new( twig_handlers => \%dispatch , # <-- ..use it! pretty_print => 'indented', ); $twig->parse( *DATA ); __DATA__ <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> #OUT <note> <from>JANI</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>

L*

There are no rules, there are no thumbs..
Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.

Replies are listed 'Best First'.
Re^2: TWig handler generation -- dispatch table
by nico38100 (Novice) on Feb 01, 2019 at 17:21 UTC

    Hello again Discipulus and thanks again for your help here the code that I try below

    my ($elements) = @_; my $del_handler = sub { $_->delete()}; my @all_element = @{$elements}; my %test; foreach $element(@all_element){ $test{$element}= \&del_handler; } open my $file_end, '>', $file_to_read.'-parsed_'.$dateLog.'.xml'; my $twig = new XML::Twig( twig_handlers => {\%test, _default_ => sub { $_[0]->flush($file_end)}} +); $twig->parsefile($file_to_read); close $file_end;

    And here the errors

    Delete Node1 unrecognized expression in handler: 'CODE(0x2bc12e8)' at C:\Users\doc\ +test_file_other.pl line 125.

      It helps if you post a complete runnable script

      #!/usr/bin/perl use strict; use warnings; use XML::Twig; use Time::Piece; my $file_to_read = 'input.xml'; my @elements_to_treat = qw(node1 node2 node3); delete_node(\@elements_to_treat); sub delete_node { my ($all_elements) = @_; my %handlers; for my $element (@$all_elements){ $handlers{$element} = sub { $_->delete() }; } my $dateLog = localtime->ymd('_'); my $file_to_write = $file_to_read.'-parsed_'.$dateLog.'.xml'; open my $fh_out, '>', $file_to_write or die "Could not open $file_to_write : $!"; $handlers{ '_default_' } = sub { $_[0]->flush($fh_out) }; my $twig = new XML::Twig( twig_handlers => \%handlers, pretty_print => 'indented', ); $twig->parsefile($file_to_read); close $fh_out; print "Created $file_to_write\n"; }
      poj

        THanks a lot, it works perfectly!

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (6)
As of 2020-05-25 15:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (146 votes). Check out past polls.

    Notices?