在 iPhone 上解析 XML






3.43/5 (7投票s)
由于我正在为 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 形式存储的任何数据实现读取器了!
阅读原始博客文章 这里。