XML::Twig gives me tags when I don't want them while selectively printing xml elements in Perl -
i'm having strangest behaviour xml::twig cannot understand.
i have xml looks following (but much, bigger, around 500 mb)
<?xml version="1.0" encoding="utf-16"?> <!doctype tmx system "tmx14.dtd"> <tmx version="1.4"> <header creationtool="memoq" creationtoolversion="6.2.21" segtype="sentence" adminlang="en-us" creationid="" srclang="pt-pt" o-tmf="memoqtm" datatype="unknown"> <prop type="defclient"> </prop> <prop type="defproject"> </prop> <prop type="defdomain"> </prop> <prop type="defsubject"> </prop> <prop type="description"> </prop> <prop type="targetlang">it</prop> <prop type="name">pt_pt-it_it</prop> </header> <body> <tu changedate="20120625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-pre"><seg>o recinto pavilhão atlântico, versátil por natureza, está vocacionado para receber os mais variados eventos.</seg></prop> <prop type="x-context-post"><seg>a sala atlântico, com uma arena de 5 200 m2, abriga, com uma versatilidade única, todo o tipo de eventos.</seg></prop> <seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg> </tuv> <tuv xml:lang="it"> <seg>È composto da tre aree fra di esse integrate, le quali sono tutte facilmente adattabili alle caratteristiche specifiche di ogni evento.</seg> </tuv> </tu> <tu changedate="20130625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>o recinto pavilhão atlântico, versátil por natureza, está vocacionado para receber os mais variados eventos.</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> <tu changedate="20140625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> <tu changedate="20140625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>teste</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> <tu changedate="20110625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>teste</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> </body> </tmx>
and following code passes twice through document: first makes hash associates each "seg" recent "changedate" attribute, scrolls document, printing "tu"'s recent (have not smaller "changedate" hashed one). here's code:
use 5.010; use strict; use warnings; use xml::twig; $filename = 'pt_pt-it_it-novo2.tmx'; $out_filename = 'out.tmx'; open $out, '>', $out_filename; binmode $out, ':encoding(utf-8)'; print "passage 1...\n"; $first_pass = new xml::twig (twig_handlers => {tu => \&first_pass}); $first_pass->parsefile($filename); $first_pass->purge(); print "done\n"; print "\npassage 2....\n"; $second_pass = new xml::twig (#twig_roots => { 'tu' => 1 }, #twig_print_outside_roots => 1, pretty_print => 'indented', twig_handlers => {tu => \&second_pass}); $second_pass->parsefile($filename); close $out; print "\ndone\n"; {my %hash; sub first_pass { my($twig, $tu) = @_; $seg = $tu->first_child('tuv')->first_child('seg')->text; $changedate = $tu->att('changedate'); if ( (!(exists($hash{$seg})) ) || (($hash{$seg}) lt $changedate) ) { $hash{$seg} = $changedate; } $twig->purge(); } sub second_pass { my($twig, $tu) = @_; #print $original_tu->text; $seg = $tu->first_child('tuv')->first_child('seg')->text; $changedate = $tu->att('changedate'); #$changedate = substr $changedate, 0, 8; #my $hash = md5($seg); if (!(($hash{$seg}) eq $changedate)) { print "================================\n"; print "not printed\n"; print $seg; print "\n because date: "; print $changedate; print " older found in pass one: "; print $hash{$seg}; print "\n=================================\n"; $twig->purge; } else { $twig->print($out); $twig->purge; } #$twig->flush($out); } }
the result when running above code on above example is:
<?xml version="1.0" encoding="utf-16"?> <!doctype tmx system "tmx14.dtd"> <tmx version="1.4"> <body> <tu changedate="20130625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>o recinto pavilhão atlântico, versátil por natureza, está vocacionado para receber os mais variados eventos.</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> </body> </tmx> <?xml version="1.0" encoding="utf-16"?> <!doctype tmx system "tmx14.dtd"> <tmx version="1.4"> <body> <tu changedate="20140625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> </body> </tmx> <?xml version="1.0" encoding="utf-16"?> <!doctype tmx system "tmx14.dtd"> <tmx version="1.4"> <body> <tu changedate="20140625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>teste</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> </body> </tmx>
as can see, enclosing brackets of "tu" tag after each deleted "tu" ("body" , "tmx") aswell opening brackets of whole xml document.
does know how can around issue?
thanks lot help, small may be!
edit: optionally, tried doing
if (!(($hash{$seg}) eq $changedate)) { print "================================\n"; print "apagado\n"; print $seg; print "\n pois data de original: "; print $changedate; print " e mais antiga que encontrada: "; print $hash{$seg}; print "\n=================================\n"; $tu->delete; } $twig->flush($out);
but this:
<?xml version="1.0" encoding="utf-16"?> <!doctype tmx system "tmx14.dtd"> <tmx version="1.4"> <header adminlang="en-us" creationid="" creationtool="memoq" creationtoolversion="6.2.21" datatype="unknown" o-tmf="memoqtm" segtype="sentence" srclang="pt-pt"> <prop type="defclient"> </prop> <prop type="defproject"> </prop> <prop type="defdomain"> </prop> <prop type="defsubject"> </prop> <prop type="description"> </prop> <prop type="targetlang">it</prop> <prop type="name">pt_pt-it_it</prop> </header> <body></body> </tmx> <?xml version="1.0" encoding="utf-16"?> <!doctype tmx system "tmx14.dtd"> <tmx version="1.4"> <header adminlang="en-us" creationid="" creationtool="memoq" creationtoolversion="6.2.21" datatype="unknown" o-tmf="memoqtm" segtype="sentence" srclang="pt-pt"> <prop type="defclient"> </prop> <prop type="defproject"> </prop> <prop type="defdomain"> </prop> <prop type="defsubject"> </prop> <prop type="description"> </prop> <prop type="targetlang">it</prop> <prop type="name">pt_pt-it_it</prop> </header> <body> <tu changedate="20130625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>o recinto pavilhão atlântico, versátil por natureza, está vocacionado para receber os mais variados eventos.</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> <tu changedate="20140625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> <tu changedate="20140625t175037z" changeid="ana"> <prop type="client"> </prop> <prop type="project"> </prop> <prop type="domain"> </prop> <prop type="subject"> </prop> <prop type="corrected">no</prop> <prop type="aligned">yes</prop> <tuv xml:lang="pt-pt"> <prop type="x-context-post"><seg>composto por três áreas integradas, todos os espaços são facilmente adaptados às características de cada evento.</seg></prop> <seg>teste</seg> </tuv> <tuv xml:lang="it"> <seg>lo spazio di pertinenza del pavilhão atlântico, versatile per natura, è adatto ricevere gli eventi più svariati.</seg> </tuv> </tu> </body> </tmx> </body> </tmx>
which has lot of "body" tags in middle aswell "header" ones. that's why decided try "print recent" strategy.
thanks again dasen
if not want whole twig printed, not print it. print relevant part:
# $twig->print($out); # prints everything. $tu->print($out);
Comments
Post a Comment