在iOS开发过程中经常用到数据的解析,在这里我想介绍的是对XML数据的解析,XML解析方法有两种,第一种是SAX解析,第二种是DOM解析
一下是一个XML文件内容:
<root>
<section>
<bigdictionary>
<group>A</group>
<array>
<stu>
<name>安以轩</name>
<sex>女</sex>
</stu>
<stu>
<name>安又琪</name>
<sex>女</sex>
</stu>
</array>
</bigdictionary>
<bigdictionary>
<group>B</group>
<array>
<stu>
<name>不知道</name>
<sex>男</sex>
</stu>
</array>
</bigdictionary>
<bigdictionary>
<group>C</group>
<array>
<stu>
<name>草</name>
<sex>未知</sex>
</stu>
</array>
</bigdictionary>
</section>
</root>
在这儿讲一下SAX解析。
SAX解析:
SAX解析是一种逐行解析的过程,不想DOM解析和JSON解析,DOM解析和JSON解析都是系统把XML文件和JSON文件全部读取之后解析的,所以JSON一般用在轻量级的数据中。解析时我们必须完全了解XML文件的结构,然后才能按照XML的格式把数据存放到容器(数组,字典)内
SAX解析中,我们用到一个类NSXMLParser
先签订协议,因为解析时需要NSXMLParser类的协议的方法
@interface XmlParsar ()<NSXMLParserDelegate>
// 解析之后我们把数据存放在一个大数组内
@property (retain, nonatomic) NSMutableArray *bigArray;
// 解析时我们需要用一个字符串传值
@property (copy, nonatomic) NSString *string;
@end
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// 根据路径获取文件
NSData *data = [NSData dataWithContentsOfFile:path];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
// 设置代理人
xmlParser.delegate = self;
// 开始解析,必须先设置代理人之后开始解析
[xmlParser parse];
[xmlParser release];
// SAX解析中,如果碰到开始节点,则走start方法,每碰到一次就走一次;
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"bigdictionary"]) {
NSMutableArray *array = [NSMutableArray array];
NSMutableDictionary *bigDic = [NSMutableDictionary dictionary];
[bigDic setObject:array forKey:@"array"];
[_bigArray addObject:bigDic];
} if ([elementName isEqualToString:@"stu"]) {
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[[[_bigArray lastObject] objectForKey:@"array"] addObject:dic];
}
}
// 如果内容在两个标签中间,则需要在结束标签中标记是哪个标签的内容,并取值
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"group"]) {
[[_bigArray lastObject] setObject:_string forKey:@"group"];
}
if ([elementName isEqualToString:@"name"]) {
[[[[_bigArray lastObject] objectForKey:@"array"] lastObject] setObject:_string forKey:@"name"];
} if ([elementName isEqualToString:@"sex"]) {
[[[[_bigArray lastObject] objectForKey:@"array"] lastObject] setObject:_string forKey:@"sex"];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
self.string = string;
}
我们可以把上面的代码封装起来,然后通过协议传值,解析完成后把容器内的内容传到相应的页面