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


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!