#import "GDataXMLNode.h"//引第三方头文件
#import "JSONKit.h"//引第三方头文件
@interface RootViewController : UIViewController<NSXMLParserDelegate>//协议
@property(nonatomic,retain)NSMutableArray *allStudentArray;
@property(nonatomic,copy)NSString *currentElement;//记录当前的标签
xml解析数据有两种方法:
1.SAX解析
2.DOM解析
SAX解析
特点:对xml格式数据进行逐步解析,就是从上到下,一行一行解析
优点:不会将xml数据读取到内存上,不占内存,适合解析大型数据
缺点:效率低,不能读取指定位置的数据,只能从上到下逐行解析
-(void)xmlbuttonAction:(UIButton *)btn
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
//系统提供SAX解析类
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
//开始解析
[parser parse];
}
//解析开始
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"解析开始");
self.allStudentArray = [NSMutableArray array];
}
//解析开始标签名
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"开始标签名 = %@", elementName);
if ([elementName isEqualToString:@"stu"])
{
//一个stu开始标签对应一个学生对象
Student *stu = [[Student alloc] init];
[self.allStudentArray addObject:stu];
[stu release];
}
//始终记录着当前标签名
self.currentElement = elementName;
}
//解析标签值
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//取出数组最后一个对象,也就是新加入的对象
Student *stu = [self.allStudentArray lastObject];
// if (self.currentElement isEqualToString:@:"number")
// {
// stu.number = string;
// }
// if (self.currentElement isEqualToString:@:"name")
// {
// stu.name = string;
// }
// if (self.currentElement isEqualToString:@:"address")
// {
// stu.address = string;
// }
// if (self.currentElement isEqualToString:@:"time")
// {
// stu.time = string;
// }
//KVC
[stu setValue:string forKey:self.currentElement];
//NSLog(@"值 = %@", string);
}
//解析结束标签名
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"结束标签名 = %@", elementName);
//防止覆盖
self.currentElement = nil;
for (Student *stu in self.allStudentArray)
{
NSLog(@"%@ %@ %@", stu.name, stu.number, stu.address);
}
}
//解析结束
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"解析结束");
}
DOM解析 是谷歌公司08年提供的一个xml解析工具
特点:将整个xml文件数据以树形结构的形式储存到内存上,然后进行读取
优点:效率快,可以读取指定位置的数据
缺点:耗内存,不适合读取大型数据
-(void)dombuttonAction:(UIButton *)btn
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
//创建dom解析对象
//参数1.data类型的数据
//参数2.苹果备用信息(无用)
//参数3.错误信息
NSError *error = nil;//初始化错误对象
//1.将数据以树形结构读取到内存上
GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
NSLog(@"error = %@", error);
//2.得到根节点
GDataXMLElement *rootElement = xmlDocument.rootElement;
NSLog(@"====%@", rootElement);
self.allStudentArray = [NSMutableArray array];
//3.遍历找到根节点<student>上的所有子节点
for (GDataXMLElement *subElement in rootElement.children)
{
Student *stu = [[Student alloc] init];
//4.遍历节点<stu>上的子节点<name>,<number>,<address>等
for (GDataXMLElement *element in subElement.children)
{
NSLog(@"value = %@, name = %@", element.stringValue, element.name);
[stu setValue:element.stringValue forKey:element.name];
}
[self.allStudentArray addObject:stu];
[stu release];
}
for (Student *stu in self.allStudentArray)
{
NSLog(@"name = %@ number = %@ address = %@", stu.name, stu.number, stu.address);
}
}
//JSONKit
-(void)jsonbuttonAction:(UIButton *)btn
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teachers" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
//使用JSONKit进行数据解析
NSMutableArray *array = [data objectFromJSONData];
NSLog(@"array = %@", array);
//使用系统类解析json数据
NSMutableArray *array2 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"array2 = %@", array2);
}
针对数据解析,不管是xml还是json,最终目的就是将网络或者本地文件中的数据取出来,存入到model属性中,并存入数组.modol属性名字根据key来决定
xml解析数据
最新推荐文章于 2023-06-19 17:16:24 发布