Click here to Skip to main content
15,887,083 members
Articles / Mobile Apps / iPhone

Parsing XML on the iPhone

Rate me:
Please Sign up or sign in to vote.
3.43/5 (7 votes)
2 Jun 2009CPOL1 min read 46.4K   11   9
Since I am developing a game engine for the iPhone that I would like to re-use, I have chosen to host all game data in the form of XML files

Introduction

Since I am developing a game engine that I would like to re-use, I have chosen to host all game data in the form of XML files. There are various reasons for doing this, partly because I can make game editors (Map Editor, Item Editor, NPC Editor, etc.) and partly because I value using re-useable code.

In order to get it all working, I had to explore the NSXMLParser given by the iPhone SDK. With XNA and the .NET Framework, I got used to reading in XML in a very specific way, and the iPhone does it quite differently. Currently, my test map’s XML file looks like this:

XML
<?xml version="1.0" encoding="UTF-8"?>
<Map>
	<MapName>Test Map</MapName>
	<MapContentName>Map001</MapContentName>
	<MapDimensions>
		<MapWidth>5</MapWidth>
		<MapHeight>5</MapHeight>
	</MapDimensions>	

	<TileDimensions>
		<TileWidth>32</TileWidth>
		<TileHeight>32</TileHeight>
	</TileDimensions>	

	<SpriteSheetName></SpriteSheetName>
	<MapLayers>
		<BaseLayer>0, 1, 0, 0, 0, 0, 0, 0, 0</BaseLayer>
		<MiddleLayer>0, 1, 0, 0, 0, 0, 0, 0, 0</MiddleLayer>
		<TopLayer>0, 1, 0, 0, 0, 0, 0, 0, 0</TopLayer>
		<AtmosphereLayer>0, 1, 0, 0, 0, 0, 0, 0, 0</AtmosphereLayer>
		<CollisionLayer>0, 0, 0, 0, 0, 0, 0, 0, 0</CollisionLayer>
	</MapLayers>
</Map>

In order to read in the XML, there are 3 methods that you need to implement. Since your XML parser goes line by line, you will need to write a method that starts an element, ends an element, and reads a character. Such as:

C++
// Start of element
- (void)parser:(NSXMLParser *)parser
			didStartElement:(NSString *)elementName
			namespaceURI:(NSString *)namespaceURI
			qualifiedName:(NSString *)qName
			attributes:(NSDictionary *)attributeDict
{
}

// Found Character
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSMutableString *)string
{
}

// End Element
- (void) parser:(NSXMLParser *)parser
			didEndElement:(NSString *)elementName
			namespaceURI:(NSString *)namespaceURI
			qualifiedName:(NSString *)qName
{
}

Once you have these methods set up, all you really need to do is populate them. For instance, in the “Start Element” method, if your “elementName” = “MapName” (in the above XML case) you would allocate the map classes NSString like so:

C++
mapName = [NSMutableString string];

When you found a character, you would store those into a string, and when the end of the element is reached, you would put that string into whatever element it was reading. For example, the map name:

C++
mapName = stringValueFromFoundCharacter;

Not too hard, but wasn’t easy to figure out either. At least I know it and now can implement readers for every data that I wish to store as XML!

Read the original blog post here.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 2 Pin
KarstenK26-Aug-13 2:14
mveKarstenK26-Aug-13 2:14 
GeneralPlease post the source code Pin
Magela20-Sep-10 23:09
Magela20-Sep-10 23:09 
GeneralMy vote of 4 Pin
baba lorenz18-Jul-10 22:47
baba lorenz18-Jul-10 22:47 
GeneralMy vote of 1 Pin
KarstenK13-Jun-10 21:56
mveKarstenK13-Jun-10 21:56 
GeneralMy vote of 1 Pin
StuGuru3-Jun-10 4:34
StuGuru3-Jun-10 4:34 
GeneralTBXML V1.3 Pin
Thomas-Soft24-Feb-10 0:02
Thomas-Soft24-Feb-10 0:02 
Generalvtd-xml Pin
Jimmy Zhang9-Jun-09 19:14
Jimmy Zhang9-Jun-09 19:14 
GeneralNSXML Parser is read-only Pin
MixxerY2-Jun-09 21:13
MixxerY2-Jun-09 21:13 
GeneralRe: NSXML Parser is read-only Pin
ThinkMud4-Jun-09 15:21
ThinkMud4-Jun-09 15:21 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.