1. 首先介绍一下XML数据结构:
XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来标记数据,定义数据类型。
特点:一对尖括号代表一个节点,或者标签;只有一个根节点;节点可以互相嵌套;没有子节点的节点称为叶子节点
例如:Student.xml
<root>
<stu_list>
<stu_array name="A">
<student>
<name>李四</name>
<age>22</age>
<tel>555555555</tel>
</student>
</stu_array>
<stu_array name="B">
<student>
<name>张三</name>
<age>20</age>
<tel>1111111111</tel>
</student>
</stu_array>
</stu_list>
</root>
2. 解析:从事先规定好的格式中提取数据。
3. XML解析时使用的工具之一: SAX
(1). SAX:Simple API for XML,基于事件驱动的解析方式,逐行解析数据。(采用协议回调机制)
(2). 解析类:NSXMLParser是iOS自带的XML解析类。
(3). 解析过程:由NSXMLParserDelegate协议方法回调,开始标签 -->取值 -->结束标签 -->取值
4. 示例代码:(解析Student.xml文件)
- (void)startParser
{
//获取需要解析的XML文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//转换为二进制
NSData *data = [NSData dataWithContentsOfFile:path];
NSXMLParser *par = [[NSXMLParser alloc] initWithData:data];
//设置代理
par.delegate = self;
//开始解析
[par parse];
[par release];
}
//开始标签-->取值
//参数描述:
//(NSXMLParser *)parser:当前解析的XML文件;(NSString *)elementName:当前标签名称;(NSDictionary *)attributeDict:当前标签属性
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//判断如果elementName == stu_array,那么创建字典将其放进去
if ([elementName isEqualToString:stu_array]) {
//数组->字典->数组格式
NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
[dic addEntriesFromDictionary:attributeDict];
NSMutableArray *stus = [[NSMutableArray alloc] init];
[dic setObject:stus forKey:@"array"];
[_stuArray addObject:dic];
}
if ([elementName isEqualToString:student]) {
StuModel *model = [[StuModel alloc] init];
NSMutableDictionary *lastDic = [_stuArray lastObject];
NSMutableArray *lastArr = [lastDic objectForKey:@"array"];
[lastArr addObject:model];
[model release];
}
}
//结束标签-->取值
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//判断内容是谁的,然后将其赋值给对应model的属性
if ([elementName isEqualToString:name]) {
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *arr = [dic objectForKey:@"array"];
StuModel *model = [arr lastObject];
model.name = _currentValue;
}
if ([elementName isEqualToString:age]) {
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *arr = [dic objectForKey:@"array"];
StuModel *model = [arr lastObject];
model.age = _currentValue;
}
if ([elementName isEqualToString:tel]) {
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *arr = [dic objectForKey:@"array"];
StuModel *model = [arr lastObject];
model.tel = _currentValue;
}
//当标签走到</root>时结束,并且保存数组
if ([elementName isEqualToString:root]) {
[self.delegate sendArray:_stuArray];
}
}
//取值:获取标签中的内容
//参数描述:(NSString *)string:当前标签的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//获取内容并保存
self.currentValue = string;
}