Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Mobile / iPhone

Parsing XML on the iPhone

3.43/5 (7 votes)
2 Jun 2009CPOL1 min read 47K  
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)