Quick bit of xml assistance required.
Monkey Forums/Monkey Programming/Quick bit of xml assistance required.
| ||
| Sample of my code bellow along with a sample of my level xml, I'm trying to load all the aliens into a list but it seems to only be grabbing the first one it comes across then ignores the others.. What am I doing wrong here.
Local i:XMLNode
Repeat
For i = EachIn node.GetChildren("alien")
Local alienname:String
Local alientype:Int
Local time:Int
alienname = i.GetAttribute("type")
Select alienname
Case "Grabber"
alientype = ALIEN_GRABBER
Case "Cargo"
alientype = ALIEN_CARGO
Case "Shooter"
alientype = ALIEN_SHOOTER
End Select
time = int(i.GetAttribute("time"))
AlienSpawner.Add(alientype, time)
Next
Until i.CountChildren = 0
<?xml version="1.0"?> <world> <level name="Pluto" hint="Pluto, Micro Planetoid."> <wave id="1" hint="Wave One" timelimit="60"> <huge rock="2" saphire="2" ruby="2" emerald="2"/> <large rock="2" saphire="2" ruby="2" emerald="2"/> <small rock="2" saphire="2" ruby="2" emerald="2"/> <alien type="Grabber" time="1000"/> <alien type="Cargo" time="2000"/> <alien type="Shooter" time="3000"/> <alien type="Grabber" time="4000"/> <alien type="Cargo" time="5000"/> <alien type="Grabber" time="6000"/> <alien type="Cargo" time="7000"/> </wave> |
| ||
I would change your XML to have more parent nodes:<?xml version="1.0"?> <world> <level name="Pluto" hint="Pluto, Micro Planetoid."> <wave id="1" hint="Wave One" timelimit="60"> <rocks> <rock type="huge" rock="2" saphire="2" ruby="2" emerald="2" /> <rock type="large" rock="2" saphire="2" ruby="2" emerald="2" /> <rock type="small" rock="2" saphire="2" ruby="2" emerald="2" /> </rocks> <aliens> <alien type="Grabber" time="1000" /> <alien type="Cargo" time="2000" /> <alien type="Shooter" time="3000" /> <alien type="Grabber" time="4000" /> <alien type="Cargo" time="5000" /> <alien type="Grabber" time="6000" /> <alien type="Cargo" time="7000" /> </aliens> </wave> </level> </world> Then you can traverse the <aliens> tag to create your objects. |
| ||
I did this...
Next
i.GetParent()
i.GetNextSibling("alien")
Until i.CountChildren = 0
I did this and it worked, not sure if its the best way tho your solution is probably a better one. adding it to my list of things to fix at a later time, its working now.. and THANKS for the quick reply mate im streaming atm and it would have held me up if I got stuck on it. |
| ||
| No worries... your code does look a bit strange, but as long as it works :) |
| ||
| ok.. need a little more help here... I went with your xml layout which is fine, but my code for parsing seems to load everything thats an alien in regardless of what branch its at. This is the first time I'v really worked with xml like this so forgive me if I'm being stupid.
Local nodes:= doc.GetDescendants("level")'.GetDescendants("wave")
nodes = doc.GetDescendants("wave")
For node = EachIn nodes
If node.GetAttribute("id") = _wave Then
If _wave = 1 Then
LevelHint.text2 = node.GetAttribute("hint")
GameClock.SetDuration(Int(node.GetAttribute("timelimit")))
Else
LevelHint.text2 = LevelHint.text
LevelHint.text = node.GetAttribute("hint")
GameClock.SetDuration(Int(node.GetAttribute("timelimit")))
GameClock.Start()
ScreenShake = True
EndIf
nodes = doc.GetDescendants("rocks")
For node = EachIn nodes
For Local i:XMLNode = EachIn node.GetChildren("huge")
Max_H_R[_level] = int(i.GetAttribute("rock"))
Max_H_C[_level] = int(i.GetAttribute("saphire"))
Max_H_G[_level] = int(i.GetAttribute("ruby"))
Max_H_E[_level] = int(i.GetAttribute("emerald"))
Next
For Local i:XMLNode = EachIn node.GetChildren("large")
Max_L_R[_level] = int(i.GetAttribute("rock"))
Max_L_C[_level] = int(i.GetAttribute("saphire"))
Max_L_G[_level] = int(i.GetAttribute("ruby"))
Max_L_E[_level] = int(i.GetAttribute("emerald"))
Next
For Local i:XMLNode = EachIn node.GetChildren("small")
Max_S_R[_level] = int(i.GetAttribute("rock"))
Max_S_C[_level] = int(i.GetAttribute("saphire"))
Max_S_G[_level] = int(i.GetAttribute("ruby"))
Max_S_E[_level] = int(i.GetAttribute("emerald"))
Next
Next
nodes = doc.GetDescendants("aliens")
Print "aliens has " + nodes.Count + "nodes"
For node = EachIn nodes
For Local i:XMLNode = EachIn node.GetChildren("alien")
Local alienname:String
Local alientype:Int
Local time:Int
alienname = i.GetAttribute("type")
Select alienname
Case "Grabber"
alientype = ALIEN_GRABBER
Case "Cargo"
alientype = ALIEN_CARGO
Case "Shooter"
alientype = ALIEN_SHOOTER
End Select
time = int(i.GetAttribute("time"))
Print "Adding Alien " + alientype + " at interval " + time
AlienSpawner.Add(alientype, time)
Next
Next
'Print "Loaded "+AlienSpawnerList.Count()+ " aliens"
EndIf
Next
<world> <level name="Pluto" hint="Pluto, Micro Planetoid."> <wave id="1" hint="Wave One" timelimit="60"> <rocks> <huge rock="1" saphire="0" ruby="0" emerald="0"/> <large rock="0" saphire="0" ruby="0" emerald="0"/> <small rock="0" saphire="0" ruby="0" emerald="0"/> </rocks> <aliens> <alien type="Grabber" time="3000"/> <alien type="Cargo" time="6000"/> <alien type="Shooter" time="9000"/> </aliens> </wave> <wave id="2" hint="Wave Two" timelimit="20"> <rocks> <huge rock="0" saphire="1" ruby="0" emerald="0"/> <large rock="0" saphire="0" ruby="0" emerald="0"/> <small rock="0" saphire="0" ruby="0" emerald="0"/> </rocks> <aliens> <alien type="Grabber" time="3000"/> <alien type="Cargo" time="6000"/> <alien type="Shooter" time="9000"/> </aliens> </wave> |
| ||
| Hey Paul, dont be so hard on yourself. I've expanded on the XML format to make it easier to use: And heres an example: Updated to include rocks It should output the following: |
| ||
| Holy fuck.... Just spent around the last hour and half trying to get your code to work with mine, in the end the only thing that was wrong was I forgot to add a <waves> branch to my xml LOL.. 3am, Time for some sleep I think.. Again mate thanks for the assist. Had some nice viewers watching me code and draw tonight which was fun, think I will keep streaming and see how things go. |
| ||
| No worries :) I was watching you off and on... you were looking a bit tired in the end - LOL! |
| ||
| Yeah rofl 4am before I finally fell asleep, you know your having fun when you totally and utterly lose track of time to the point where you start to hear the birds dawn chorus. . |