SAX方式解析XML数据
SAX:Simple API for XML。基于事件驱动的解析方式,逐行解析数据。(采用协议回调机制)
NSXMLParser是iOS自带的XML解析类。采用SAX方式解析数据
解析过程:开始标签->取值->结束标签->取值
使用方式:
前提加入协议:<NSXMLParserDelegate>
具体使用如下:
// SAX方式解析XML数据
// 1.获得xml数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"student" ofType:@"xml"];
// 2.将路径下的文件转化为NSData
NSData *data = [NSData dataWithContentsOfFile:path];
// 3.系统使用NSXMLPaser解析XML数据
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 4.设置代理
parser.delegate = self;
// 5.开始解析
[parser parse];
#pragma mark - xml解析的协议方法
// 发现标题头
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// NSLog(@"标题头%@", elementName);
// 当节点头是student的时候 创建一个学生对象
if ([elementName isEqualToString:@"student"] == 1) {
Student *stu = [[Student alloc] init];
[self.array addObject:stu];
[stu release];
}
NSLog(@"%@", attributeDict);
}
// 发现内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// NSLog(@"%@", string);
self.valuesStr = string;
}
// 发现节点尾
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
Student *stu = [self.array lastObject];
if ([elementName isEqualToString:@"number"] == 1) {
stu.number = [self.valuesStr integerValue];
}
if ([elementName isEqualToString:@"name"] == 1) {
stu.name = self.valuesStr;
}
if ([elementName isEqualToString:@"sex"] == 1) {
stu.sex = self.valuesStr;
}
if ([elementName isEqualToString:@"phone"] == 1) {
stu.phone = [self.valuesStr integerValue];
}
}
DOM方式解析XML数据
DOM:Document Object Model(文档对象模型)。解析时需要将XML文件整体读入,并且将XML结构化成树状,使用再通过树状结构读取相关数据。
GDataXMLNode是Google提供的开源XML解析类,对 libxml2.dylib进⾏行了Objective-C的封装
采用DOM方式解析数据
iOS中包含一个Cyuyan的动态链接库 libxml2.dylib,解析速度比NSXMLParser快
使用方式:
将GDataXMLNode.h GDataXMLNode.m 导入文件
在Header Search Paths 中添加 /usr/include/libxml2
在Other Linker Flags 中添加 -lxml2
OK,完成导入文件
具体使用如下:
NSString *path = [[NSBundle mainBundle] pathForResource:@"student" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
// GDataXMLNode类的使用
// 1.获取xml文件的 文件结构
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 2.获取xml文件的根节点(rootElement)
GDataXMLElement *rootElement = [document rootElement];
// 3.获取 子节点(根据节点的名字)
NSArray *elements = [rootElement elementsForName:@"student"];
// 4.循环 遍历 所有子结点, 进一步获取数据
for (GDataXMLElement *element in elements) {
NSArray *nameElements = [element elementsForName:@"name"];
GDataXMLElement *nameNode = [nameElements firstObject];
NSString *name = [nameNode stringValue];
GDataXMLElement *numberElements = [[element elementsForName:@"number"] firstObject];
NSInteger number = [[numberElements stringValue] integerValue];
GDataXMLElement *sexElements = [[element elementsForName:@"sex"] firstObject];
NSString *sex = [sexElements stringValue];
GDataXMLElement *phontElements = [[element elementsForName:@"phone"]firstObject];
NSInteger phone = [[phontElements stringValue] integerValue];
Student *stu = [[Student alloc] init];
stu.name = name;
stu.number = number;
stu.sex = sex;
stu.phone = phone;
[_array addObject:stu];
[stu release];
}
NSLog(@"%@", _array);
使用Foundation进行JSON解析
// 1.获得文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"studentJSON" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 2.解析
id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", object);
使用JSONKit进行JSON解析
JSONKit是Object-C一个处理json数据的库,非常高效而且易用。
使用方法:
将包JSONKit导入到工程中
具体使用如下:
NSString *path = [[NSBundle mainBundle] pathForResource:@"studentJSON" ofType:@"txt"];
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSArray *arrlist = [str objectFromJSONString];
NSLog(@"%d", [arrlist count]);
for (int i = 0; i < [arrlist count]; i ++) {
NSDictionary *dic = [arrlist objectAtIndex:i];
NSString *name = [dic objectForKey:@"name"];
NSLog(@"%@", name);
}