Dear Monks,

I have been working on a script that parses XML using the XML::Simple module. I am now in a phase where I want to make my code more dynamic. (it's already quite dynamic, but not in nesting eg more xml sub sub sub sub sub elements.)

I have quite some nested loops that all need values from upper loops. Now I wonder if it is possible to make this script more universal with XML::Simple

As you will see I speak to the top XML element and start 'for' looping everything. Then I use for $i loops every time again. Just look at the code and you will see that $sub1 $sub2 $sub3 and $sub4 are the same

Is there a way to program more effecient when you need those loops for building references?

#!/usr/bin/perl -- use strict; use warnings; use Cwd; use Win32::OLE; use XML::Simple; my $dir = cwd(); opendir(DIR, "."); my @file = grep(/\.xml$/,readdir(DIR)); closedir(DIR); use Data::Dumper; local $Data::Dumper::Indent=1; #print Dumper($doc); my $xs1 = XML::Simple->new(); my $doc = $xs1->XMLin($file[0], keyattr=>[], ForceContent=>1, ForceArr +ay=>1); for my $sub1 ( sort keys %{ $doc } ){ unless (ref($doc->{$sub1})) { print "$doc->{$sub1} is not a reference at + all.\n"; next; } my $count = @{ $doc->{$sub1} }; print "\n$sub1\t"; for (my $i=0; $i <= $count; $i++) { for my $sub2 ( sort keys %{ $doc->{$sub1}[$i] } ){ unless (ref($doc->{$sub1}[$i]{$sub2})) { print "$doc->{$sub1}[$i]{$sub2} is not a r +eference at all.\n"; next; } my $count2 = @{$doc->{$sub1}[$i]{$sub2}}; for (my $j=0; $j <= $count2; $j++) { for my $sub3 ( sort keys %{ $doc->{$sub1}[$i]{$sub2}[$ +j] } ){ unless (ref($doc->{$sub1}[$i]{$sub2}[$j]{$ +sub3})) { print "$doc->{$sub1}[$i]{$sub2}[$j]{$sub3} + is not a reference at all.\n"; next; } my $count3 = @{$doc->{$sub1}[$i]{$sub2}[$j]{$sub3} +}; print "\n\t$sub2\t$sub3($count3)"; for (my $k=0; $k <= $count3; $k++) { print "\n"; for my $sub4 ( sort keys %{ $doc->{$sub1}[$i]{ +$sub2}[$j]{$sub3}[$k] } ){ print "\n\t\t\t$sub4 : "; print $doc->{$sub1}[$i]{$ +sub2}[$j]{$sub3}[$k]{$sub4}; } } } } } } }
And the XML for the ones who like to run it:
<A type="not_a_reference"> <B type="not_a_reference"> <C types="not_a_reference"> <element type="k" name="p" online="yes"/> <element type="i" name="e" online="yes"/> </C> <D jammer="not_a_reference"> <element type="kd" name="pd" online="no"/> <element type="id" name="ed" online="yes"/> <element type="yd" name="zd" online="no"/> </D> </B> <Z type="klote" zever="not_a_reference"> <C> <element type="k" name="z" online="yes"/> <element type="t" name="p" online="yes"/> </C> <E type="not_a_reference"> <element type="kd" name="pd" online="no" zever="inpakstkes +"/> <element type="id" name="ed" online="yes"/> </E> </Z> </A>

In reply to Nested Loops vs Good programming by Sporti69

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.