解析:从事先规定好的格式中提取数据
数据结构解析分为两类:XML解析、JSON解析。
XML解析:
XML解析又分为SAX解析、DOM解析
SAX解析:一边读取XML文档一边处理
1/必须继承NSXMLParserDelegate协议
2/设置XML数据,并初始化NSXMLParser
3/执行代理的三个方法
- (void)startParser
{
//获取本地XML文件的路径
NSString*path=[[NSBundle mainBundle]pathForResource:@"StuList" ofType:@"xml"];
//根据文件路径获得文件中的内容
NSData *data = [NSData dataWithContentsOfFile:path];
NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:data] autorelease];
// 设置代理
[parser setDelegate:self];
}
// 解析的时候,只要解析到了开始节点,就立刻走这个协议 将获取到的值放在数组里
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"stu"]) {
Model *myModel = [[Model alloc] init];
[_array addObject:myModel];
[myModel release];
}
}
//找到开始标记和结束标记之间的字符时,调用这个方法。读取两节点间的具体内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
self.found = string;
}
// 遇见结束标记时会调用这个方法,所以要在取值阶段把值放到属性里
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
Model *last = [_array lastObject];
if ([elementName isEqualToString:@"name"]) {
last.name = _found;
}
if ([elementName isEqualToString:@"gender"]) {
last.gender = _found;
}
if([elementName isEqualToString:@"age"]) {
last.age = _found;
}
if ([elementName isEqualToString:@"root"]) {
}
}
DOM解析: 读入整个XML文档并构建一个驻留内存的树结构,通过遍历树结构可以检索任意XML节点,读取它的属性和值。
- (void)domParser2
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"StuList" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
//对通篇文章进行整体解析
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:GDataXMLDocumentKind error:nil];
//获得根节点
GDataXMLElement *root = [document rootElement];
//获得所有的根节点下面的stulist节点的stu节点
NSArray *array = [root nodesForXPath:@"stulist/stu" error:nil];
//遍历每个stu下面的节点并判断出节点名,放到相应的model属性中
for (GDataXMLElement *ele in array) {
Model *my = [[[Model alloc] init]autorelease];
//获得ele下面的所有子节点
NSArray *children = [ele children];
for (GDataXMLElement *child in children) {
//获得节点的名字
NSString *name = [child localName];
if ([name isEqualToString:@"name"]) {
//获得节点的值
my.name = [child stringValue];
}
if ([name isEqualToString:@"gender"]) {
my.gender = [child stringValue];
}
if ([name isEqualToString:@"age"]) {
my.age = [child stringValue];
}
}
}
}
JSon解析:轻量级的数据交换格式,采用完全独立于语言的文本格式,被称为理想的数据交换语言
1/大括号代表字典
2/中括号代表数组
3/冒号的左右两边分别为键和值(key:value)
4/数据和数据之间用逗号隔开
- (void)jsonParser
{
// 读取本地文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"City" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSDictionary *dic = [array objectAtIndex:0];
NSString *name = [dic objectForKey:@"name"];
}