通常,开发出来的应用都具有网络功能,如此一来,避免不了要接收网络数据,这里聊聊XML格式数据的解析。xml文件截图:
要解析数据,首先要找到想要解析文件的路径,也就是xml的路径,这里把xml放在本地Bundle包中,代码如下:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"]; //获取bundle包的xml文件地址
NSData *aData = [NSData dataWithContentsOfFile:path];
NSString *str = [[NSString alloc]initWithData:aData encoding:NSUTF8StringEncoding]; //把NSData地址的文件转换为NSString
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:aData];
获得了文件路径之后,就要开始解析数据了,系统为我们准备了个协议,NSXMLParserDelegate来解析数据,这里,我们用三个方法来解析数据。
//该方法遍历开始标签,有多少个开始标签,该方法执行多少次
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
//该方法遍历结束标签,有多少个结束标签,该方法执行多少次
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
//数据解析时走该方法
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
接下来,用上面的三个方法解析数据,代码如下:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:kStudent]) {
CustomModel *model = [[CustomModel alloc] init];
[_allArray addObject:model];
NSLog(@"%@",_allArray);
[model release];
}
} //开始解析,xml有多少行,方法走多少次
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
CustomModel *model = [_allArray lastObject];
if ([elementName isEqualToString:kNumber]) {
model.number = _current;
}
if ([elementName isEqualToString:kName]) {
model.name = _current;
}
if ([elementName isEqualToString:kSex]) {
model.sex = _current;
}
if ([elementName isEqualToString:kPhone]) {
model.phone = _current;
}
if ([elementName isEqualToString:kStudent]) {
[self.delegate sendModelToRoot:_allArray];
} //最后一个if完成传值
} // 结束解析
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
_current = [string copy];
} //解析xml中的内容
xml解析到此完毕。