65.9K
CodeProject 正在变化。 阅读更多。
Home

在 iPhone 上解析 XML

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.43/5 (7投票s)

2009年6月2日

CPOL

1分钟阅读

viewsIcon

47971

由于我正在为 iPhone 开发一个游戏引擎,并且希望能够重用它,所以我选择以 XML 文件形式存储所有游戏数据。

引言

由于我正在开发一个希望能够重用的游戏引擎,所以我选择以 XML 文件形式存储所有游戏数据。这样做有多种原因,一部分是因为我可以制作游戏编辑器(地图编辑器、物品编辑器、NPC 编辑器等),另一部分是因为我重视使用可重用的代码。

为了使这一切正常工作,我不得不探索 iPhone SDK 提供的 NSXMLParser。在使用 XNA 和 .NET Framework 时,我习惯了以一种特定的方式读取 XML,而 iPhone 的处理方式则完全不同。目前,我的测试地图的 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>

为了读取 XML,你需要实现 3 个方法。由于你的 XML 解析器逐行进行,你需要编写一个方法来开始一个元素、结束一个元素和读取一个字符。例如:

// 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
{
}

一旦你设置好这些方法,你真正需要做的就是填充它们。例如,在“开始元素”方法中,如果你的“elementName” = “MapName”(在上面的 XML 案例中),你将像这样分配地图类 NSString

mapName = [NSMutableString string];

当你找到一个字符时,你将把它存储到一个 string 中,当到达元素的末尾时,你将把这个 string 放入它正在读取的任何元素中。例如,地图名称:

mapName = stringValueFromFoundCharacter;

不难,但也不是很容易弄清楚。至少我现在知道了,并且可以为我希望以 XML 形式存储的任何数据实现读取器了!

阅读原始博客文章 这里

© . All rights reserved.