Hi:
I'm trying to construct something like a nested for loop structuire to
read the data out of an XML file using XML::Simple.
Here's the sample xml...
<?xml version='1.0' encoding='ISO-8859-1' ?>
<ARBORINFO NAME="Info about Trees">
<FOREST NAME="olympic">
<TREE NAME="spruce">
<DIAM_HEIGHT>4.0,70.0</DIAM_HEIGHT>
<DIAM_HEIGHT>4.1,70.1</DIAM_HEIGHT>
<DIAM_HEIGHT>4.2,70.2</DIAM_HEIGHT>
</TREE>
<TREE NAME="redwood">
<DIAM_HEIGHT>5.0,80.0</DIAM_HEIGHT>
<DIAM_HEIGHT>5.1,80.1</DIAM_HEIGHT>
<DIAM_HEIGHT>5.2,80.2</DIAM_HEIGHT>
<DIAM_HEIGHT>5.3,80.3</DIAM_HEIGHT>
</TREE>
<TREE NAME="pine">
<DIAM_HEIGHT>3.0,60.0</DIAM_HEIGHT>
<DIAM_HEIGHT>3.1,60.1</DIAM_HEIGHT>
</TREE>
</FOREST>
<FOREST NAME="acadia">
<TREE NAME="birch">
<DIAM_HEIGHT>1.0,30.0</DIAM_HEIGHT>
<DIAM_HEIGHT>1.1,30.1</DIAM_HEIGHT>
<DIAM_HEIGHT>1.2,30.2</DIAM_HEIGHT>
<DIAM_HEIGHT>1.3,30.3</DIAM_HEIGHT>
<DIAM_HEIGHT>1.4,30.4</DIAM_HEIGHT>
<DIAM_HEIGHT>1.5,30.5</DIAM_HEIGHT>
</TREE>
<TREE NAME="oak">
<DIAM_HEIGHT>3.0,50.0</DIAM_HEIGHT>
<DIAM_HEIGHT>3.1,50.1</DIAM_HEIGHT>
<DIAM_HEIGHT>3.2,50.2</DIAM_HEIGHT>
<DIAM_HEIGHT>3.3,50.3</DIAM_HEIGHT>
</TREE>
<TREE NAME="maple">
<DIAM_HEIGHT>2.0,40.0</DIAM_HEIGHT>
</TREE>
</FOREST>
<FOREST NAME="caddo">
<TREE NAME="scrb">
<DIAM_HEIGHT>0.5,30.0</DIAM_HEIGHT>
</TREE>
</FOREST>
</ARBORINFO>
And here's the code that I got to partially work....
use XML::Simple;
$xml = new XML::Simple;
$phl = $xml->XMLin("./small.xml");
for(my $x=0;$x<$#{$phl->{FOREST}}+1;$x++)
{
$fname = $phl->{FOREST}[$x]{NAME};
$z = 0;
print "forest: $fname \n";
for(my $y=0;$y<$#{$phl->{FOREST}[$x]{TREE}}+1;$y++)
{
$tname = $phl->{FOREST}[$x]{TREE}[$y]{NAME};
print " tree: $tname\n";
for(my $z=0;$z<$#{$phl->{FOREST}[$x]{TREE}[$y]{DIAM_HEIGHT}}+1;$z++)
{
$tdata = $phl->{FOREST}[$x]{TREE}[$y]{DIAM_HEIGHT}[$z];
print " tdata: $tdata\n";
}
}
}
And this is what I got...
forest: olympic
tree: spruce
tdata: 4.0,70.0
tdata: 4.1,70.1
tdata: 4.2,70.2
tree: redwood
tdata: 5.0,80.0
tdata: 5.1,80.1
tdata: 5.2,80.2
tdata: 5.3,80.3
tree: pine
tdata: 3.0,60.0
tdata: 3.1,60.1
forest: acadia
tree: birch
tdata: 1.0,30.0
tdata: 1.1,30.1
tdata: 1.2,30.2
tdata: 1.3,30.3
tdata: 1.4,30.4
tdata: 1.5,30.5
tree: oak
tdata: 3.0,50.0
tdata: 3.1,50.1
tdata: 3.2,50.2
tdata: 3.3,50.3
tree: maple
forest: caddo
Not an ARRAY reference at tryxml.pl line 12.
2 things to note....
1) It didn't pick up on the sole "maple" tree in "acadia"
2) It outright croaked when it tried to reference the sole tree in
"caddo" as an array.
I'm wide open as to suggestions on how to accomplish this. If foreach
can be used somehow, I'm wide open to that.