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

maha has asked for the wisdom of the Perl Monks concerning the following question:

Hi experts,

I've problem in multilevel tag closing,i want to close the tags form the inner level then come to close its outer level

e.g

<P_Normal><list-bull></P_Normal> <P_list-bull(1)>Use Microsoft Windows accessibility options to: </P_li +st-bull(1)> <P_list-simple(2)>&#x2013; Magnify the display </P_list-simple(2)> <P_list-simple(2)>&#x2013; Change the size of text and icons </P_lis +t-simple(2)> <P_list-simple(2)>&#x2013; Convert the text displayed into speech &# +x0028;i.e. narrator&#x0029; </P_list-simple(2)> <P_list-simple(2)>&#x2013; Change the contrast </P_list-simple(2)> <P_list-simple(2)>&#x2013; Display an onscreen keyboard </P_list-sim +ple(2)> <P_list-simple(2)>&#x2013; Convert the mouse for left-handed use. </ +P_list-simple(2)> <P_list-bull(1)>Deliver learning through an audio podcast rather than +written handouts for visually impaired learners. </P_list-bull(1)> <P_list-bull(1)>Increase the character size on handouts for visually i +mpaired learners. </P_list-bull(1)> <P_list-bull(1)>Adjust background colours and fonts to assist dyslexic + learners. </P_list-bull(1)> <P_list-bull(1)>&#x003C;pg&#x003E;13&#x003C;/pg&#x003E;Provide feedbac +k on written work using the comments facility and track changes rathe +r than handwritten notes, so that the learners can change character s +ize or use a text to speech application to hear feedback.</P_list-bul +l(1)> </list-bull>

my output should be like the below code

<list list-type="bullet"> <list-item><p>Use Microsoft Windows accessibility options to: <list list-type="simple"> <list-item><p>&#x2013; Magnify the display</p></list-item> <list-item><p>&#x2013; Change the size of text and icons</p></list-ite +m> <list-item><p>&#x2013; Convert the text displayed into speech (i.e. na +rrator)</p></list-item> <list-item><p>&#x2013; Change the contrast</p></list-item> <list-item><p>&#x2013; Display an onscreen keyboard</p></list-item> <list-item><p>&#x2013; Convert the mouse for left-handed use.</p></lis +t-item> </list></p></list-item> <list-item><p>Deliver learning through an audio podcast rather than wr +itten handouts for visually impaired learners.</p></list-item> <list-item><p>Increase the character size on handouts for visually imp +aired learners.</p></list-item> <list-item><p>Adjust background colours and fonts to assist dyslexic l +earners.</p></list-item> <list-item><p><xref ref-type="page" id="page_13"/>Provide feedback on +written work using the comments facility and track changes rather tha +n handwritten notes, so that the learners can change character size o +r use a text to speech application to hear feedback.</p></list-item> </list>

i tried the below code but i gives single item list only i d't know where its wrong pls correct my mistake monk's

use strict; my $inputfile = $ARGV[0]; open (IN,"$inputfile") || die ("Can't open the input file for reading" +); undef $/; my $str = <IN>; while($str =~ /<list-(bull)>(?:(?:(?!<\/list-bull>).)*)<\/list-\1>/sg +i) { $str =~ s#<list-(bull)>(?:(?:(?!<\/list-bull>).)*)<\/list-\1>#&Lis +t_find($&)#sgie; } sub List_find { my $line = @_[0]; my $currentlevel = 0; while($line =~ /^[\s\S]*?<(P_list-(\w+)\((\d+)\))>(.*?)<\/\1>\s*/si) { my ($tag, $kind, $level, $text) = ($1, $2, $3, $4); if ($currentlevel < $level) { while($currentlevel < $level) { $line = "\n<list list-type=\"$kind\">\n<list-item><p>"; $currentlevel++; } } elsif ($currentlevel > $level) { while($currentlevel > $level) { $currentlevel--; $line ="</p></list-item>\n</list>\n"; } $line = "</p></list-item>\n<list-item><p>"; } else { $line = "</p></list-item>\n<list-item><p>"; } $line .= $text; # print $line; } while($currentlevel > 0) { $currentlevel--; $line .= "</p></list-item>\n</list>\n"; } #print $line; return "$line"; } open (OUT,">$inputfile\.xml") || die ("Can't open the output file for +writing"); print OUT $str; close (OUT);

pls consider my problem

Replies are listed 'Best First'.
Re: Multilevel tag closing
by choroba (Cardinal) on Jan 09, 2012 at 10:37 UTC
    This works for your example input, but is not general. You should be able to base the general solution on it, though. BTW, the one who created the original format probably never thought about the possibility anyone would like to use it.