SAX
: simple API for XML
解析xml数据
- (void)xmlParserUpData{
// 利用的是系统的NSXMLParser
// xml分析类
// 以驱动事件进行xml的解析(利用触发得的代理方法解析)
// 特点: 逐行解析
// 获取路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// 创建要分析的二进制文件
NSData *data = [NSData dataWithContentsOfFile:path];
// 创建分析人
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 驱动事件(设置代理)
parser.delegate = self;
// 开始分析
[parser parse];
[parser release];
}
-----------------------------------------------------------------------
NSXMLParser代理方法实现
// 数组(保存model)
// model保存节点中间的 值 (字符串)
// 已经开始分析文件
- (void)parserDidStartDocument:(NSXMLParser *)parser{
self.dataArray = [NSMutableArray array];
NSLog(@"已经开始分析文件");
}
// 已经开始遇到节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
// 遇到student节点时初始化student
if ([elementName isEqualToString:@"Student"]) {
self.stu = [[Student alloc] init];
}
// NSLog(@"<%@>",elementName);
// NSLog(@"已经开始遇到节点");
}
// 发现字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
self.str = string;
// NSLog(@"%@",string);
// NSLog(@"发现字符串");
}
// 遇到结束节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"name"]) {
self.stu.name = self.str;
}else if ([elementName isEqualToString:@"gender"]){
self.stu.gender = self.str;
}else if ([elementName isEqualToString:@"age"]){
self.stu.age = self.str;
}else if([elementName isEqualToString:@"motto"]){
self.stu.motto = self.str;
}else if([elementName isEqualToString:@"Student"]){
[self.dataArray addObject:self.stu];
[_stu release];
}
// NSLog(@"</%@>",elementName);
// NSLog(@"已经遇到结束节点");
}
// 结束文件分析
- (void)parserDidEndDocument:(NSXMLParser *)parser{
// 这是装完所有的model
NSLog(@"%@",self.dataArray);
NSLog(@"已经结束文件分析");
}
-----------------------------------------------------------------------
GDataXMLNode第三方类库解析(Dom解析)
引入谷歌的第三方类库GDataXMLNode需要引入系统框架libxml2
1. 工程->General-> Linked FrameWorks and Libraries添加;或者在工程->Build Phases->Link Binary With Libraries下添加
2. 工程->Build Settings->Search Paths->Header Search Paths添加路径 /usr/include/libxml2
- (void)GDataXMLNodeUpData{
// 获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// 创建一个data对象
NSData *data = [NSData dataWithContentsOfFile:path];
// 创建一个空的错误对象
NSError *error = nil;
// 初始化文件对象
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
// 获取根节点
GDataXMLElement *rootElement = [document rootElement];
// NSLog(@"%@",[rootElement stringValue]);
// 获取根节点下 student节点
NSArray *elmentArray = [rootElement elementsForName:@"Student"];
// 初始化数组
self.dataArray = [NSMutableArray array];
// 遍历数组 对每一个sudent节点继续化整为零
for (GDataXMLElement *elment in elmentArray) {
// // 取出name节点
// NSArray *nameElmentArray = [elment elementsForName:@"name"];
//
// // 从数组中取出name节点的值
// GDataXMLElement *nameElement = nameElmentArray[0];
//
// // 把节点中的值取出来
// NSString *name = [nameElement stringValue];
Student *stu = [[Student alloc] init];
NSString *name = [self dataToString:elment elementName:@"name"];
stu.name = name;
NSString *age = [self dataToString:elment elementName:@"age"];
stu.age = age;
NSString *gender = [self dataToString:elment elementName:@"gender"];
stu.gender = gender;
NSString *motto = [self dataToString:elment elementName:@"motto"];
stu.motto = motto;
[self.dataArray addObject:stu];
// 释放 ++++++++++++++++
[stu release];
}
}
// 1.找报红的对象(报红方法中没有,需要外界传递)
// 2.找可变对象(例如name等 需要外界传递)
// 3.选好返回值
- (NSString *)dataToString:(GDataXMLElement *)element elementName:(NSString *)elementName{
// 取出name节点
NSArray *nameElmentArray = [element elementsForName:elementName];
// 从数组中取出name节点的值
GDataXMLElement *nameElement = nameElmentArray[0];
// 把节点中的值取出来
NSString *name = [nameElement stringValue];
return name;
}