XML question
BlitzMax Forums/Brucey's Modules/XML question
| ||
| I cannot understand how to read some data. I have this xml file based on the Tiled program: <?xml version="1.0" encoding="UTF-8"?> <map version="1.0" orientation="orthogonal" width="30" height="30" tilewidth="40" tileheight="40"> <tileset firstgid="1" name="GRS2ROC" tilewidth="40" tileheight="40"> <image source="C:/MonkeyPro69/modules/fantomEngine/examples/TileMaps/Tiled/Tiled.data/maps/GRS2ROC.png" width="640" height="480"/> </tileset> <layer name="Tile Layer 1" width="30" height="30"> <data> <tile gid="68"/> <tile gid="68"/> . . . <tile gid="68"/> <tile gid="0"/> <tile gid="0"/> </data> </layer> </map> I figured out how to search for a node and I have found: -'tileset' -'layer' then, I am searching in the 'layer' node and I found: -'data' The question is how to read all the "<tile gid="68"/>" values ?? here it is my code:
Method parseXMLFile(docname:String)
Local doc:TxmlDoc
Local node:TxmlNode
doc = TxmlDoc.parseFile("graphics\" + docname)
If doc = Null Then
Print "Document not parsed successfully."
Return
End If
node = doc.GetRootElement()
If node = Null Then
Print "empty document"
doc.free()
Return
End If
Local children:TList = node.getChildren()
'read scene info
For node = EachIn children
'Print node.getName()
If node.getName() = "tileset" Then
'Print "found a tileset"
parseTilesetNode(doc, node)
End If
If node.getName() = "layer" Then
'Print "found a tileset"
parseLayerNode(doc, node)
End If
Next
doc.free()
Return
End Method
Method parseTilesetNode(doc:TxmlDoc, node:TxmlNode)
Local textureName:String
textureName = node.getAttribute("name")
Print "textureName = " + textureName
Return
End Method
Method parseLayerNode(doc:TxmlDoc, node:TxmlNode)
Local layerWidth:String
Local layerHeight:String
layerWidth = node.getAttribute("width")
layerHeight = node.getAttribute("height")
Local children:TList = node.getChildren()
For node = EachIn children
If node.getName() = "data" Then
'parseDataNode(doc, node)
End If
Next
Return
End Method
Method parseDataNode(doc:TxmlDoc, node:TxmlNode)
End Method
|
| ||
| Hallo. There are several ways to go about this. One way, like you've done, is just have lots of methods parsing each node separately. Another way is to have an Object structure which resembles your tree. Each Object could subclass a "node" base type, and have a "decode" method of some kind. This method would know how to process only it's own matching node type. So, your TLayer would know it had a data node, and so on. For small xml trees, this can be an simple way to build your xml load/save code, as well as having a ready-to-use object tree. Yet another way, if you are searching for specific kinds of nodes within a tree, is to use XPath. As its name suggests, you can search the tree based on a path of sorts. For example, I can get a list of all tile nodes with a gid of 68 using this search text : //tile[@gid=68] (find all nodes of name "tile", with attribute "gid" equal to "68") If you look in the libxml module docs, there's an xpath.bmx example, that you can play around with. Replace the file with yours, and try the xpath. And there's some syntax available here : http://www.w3schools.com/xpath/xpath_syntax.asp :o) |
| ||
| I solved it using the 1st method with a lot of methods. Anyway I really have to learn all the stuff about xml because sometimes I am stuck in little issues like that. Thanks, |