Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??

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":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (4)
As of 2024-04-25 16:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found