in reply to xml to xml with script process

Hi

I would recommend using Twig it is quite easy and very flexible. I did some similar work and looked at several CPAN modules but in the end Twig seems to be one of the easiest and most flexible solutions out there.

Replies are listed 'Best First'.
Re^2: xml to xml with script process
by mickep76 (Beadle) on Oct 05, 2009 at 07:39 UTC

    Using Twig you could do something like below.

    use strict; use XML::Twig; $file = 'test.xml'; my $twig = XML::Twig->new( twig_handlers => { div => \&div_handler }, pretty_print => 'indented' ); $twig->parsefile($file); $twig->flush(); sub div_handler { my ($twig, $div)= @_; if($div->{'att'}->{'class'} eq "P_FM_EPG_INTRO_FIRST") { $div->set_tag('paragraph'); $div->set_att(class => "PFMEPGINTROFIRST"); $div->set_att(style => "FM_EPG_INTRO_FIRST"); } }

      Hi mickep76,
      Thanks for your reply. I am facing data loss some time while executing my script. is there any way to find the data loss.

      I am using the below code.
      use strict; use warnings; use XML::Parser; use XML::Twig; my $xmlfile = 'input1.xml'; # the file to parse # initialize parser object and parse the string my $parser = XML::Parser->new( ErrorContext => 2 ); eval { $parser->parsefile( $xmlfile ); }; # report any error that stopped parsing, or announce success if( $@ ) { $@ =~ s/at \/.*?$//s; # remove module line number print STDERR "\nERROR in '$xmlfile':\n$@\n"; exit; } my $twig=XML::Twig->new(twig_handlers=>{ # indd_document=>\&root_process +, # div => \&div_handler, # content => \&content_handler, }); $twig->parsefile( $xmlfile); open(FH,">output.xml") or die "cannot open output.xml: $!"; my $temp = $twig->toString; print FH $temp; close (FH); $twig->purge; #root tag "indd_document" process here sub root_process { my( $twig, $root)= @_; $root->set_tag( 'document'); $root->set_atts({OutputCreationDate=>'20090510', OutputCreationT +ime=>'00:00:00', 'xml:space'=>"preserve"}); $root->purge; } #paragraph element process goes here sub div_handler { my ($twig, $div)= @_; $div->set_tag('paragraph'); $div->del_att('cstyID','pstyID'); my $attval=$div->att('class'); $attval=~s/P_//; $div->set_att(style => $attval); $attval=~s/_//g; $attval="P".$attval; $div->set_att(class =>$attval); $div->purge; } #content tag handler sub content_handler { my ($twig, $content)= @_; #For textbox element if($content->{'att'}->{'type'} eq "text") { $content->set_tag('textbox'); $content->del_atts; $content->set_atts({bid=>'', aid=>'', att=>'', pgnbr=>'', pgsect=> +'', spp=>'', spf=>'', top=>'', left=>'', height=>'', bh=>'', width=>' +', bw=>'', colums=>'', gutter=>'', ts=>'', ls=>'', bs=>'', rs=>'', t= +>'', l=>'', b=>'', r=>'', tit=>'', til=>'', tib=>'', tir=>'', color=> +'', cn=>'', framewidth=>'', framecolor=>'', fcn=>'', grp=>''}); } $content->purge; }