XML数据解析-SAX和DOM
2015-10-04 16:45
260 查看
XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据。
StudentInfo_XML文件:
<Students>
<student>
<name>刘爽</name>
<age>18</age>
<gender>male</gender>
<hobby>孙聚德</hobby>
<phone>18791696178</phone>
</student>
<student>
<name>张国城</name>
<age>19</age>
<gender>male</gender>
<hobby>张飞</hobby>
<phone>15650779772</phone>
</student>
<student>
<name>杨小龙</name>
<age>23</age>
<gender>male</gender>
<hobby>LOL,购物,散打</hobby>
<phone>13666666666</phone>
</student>
<student>
<name>袁海洋</name>
<age>2</age>
<gender>male</gender>
<hobby>女</hobby>
<phone>18390679292</phone>
</student>
<student>
<name>李宝剑</name>
<age>20</age>
<gender>male</gender>
<hobby>iOS Teacher</hobby>
<phone>183906792921</phone>
</student>
<student>
<name>潘浩</name>
<age>22</age>
<gender>female</gender>
<hobby>iOS</hobby>
<phone>15033351572</phone>
</student>
</Students>
主要代码:
数据模型类:
Student.h文件中
@interface Student : NSObject
//声明属性
@property(nonatomic,copy) NSString *name;
@property(nonatomic,assign) NSInteger age;
@property(nonatomic,copy) NSString *gender;
@property(nonatomic,copy) NSString *hobby;
@property(nonatomic,copy) NSString *phone;
@end
.m文件中
#pragma mark------------防止KVC出错
-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{
//1.防止键用了关键字
if ([key isEqualToString:@"int"]) {
_age = [value integerValue];
//2.防止key值书写错误
NSLog(@"%@",key);
}
}
#pragma mark----------debug模式校验对象(实际开发中不用写,只是在调试时用)
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld,gender:%@,hobby:%@,phone:%@",_name,_age,_gender,_hobby,_phone];
}
SAX:Simple API for XML :基于事件驱动的解析方式,逐行解析数据。(采用协议回调机制)
解析过程:开始标签->取值->结束标签->取值
SAX方法解析的主要代码:
视图控制器的.m文件中
@interface ViewController ()<NSXMLParserDelegate>
#pragma mark--------声明一个盛放model对象的数组
@property(nonatomic,strong) NSMutableArray *array;
#pragma mark--------当前节点
@property(nonatomic,strong) NSString *currentElement;
@end
- (IBAction)xmlSAXAction:(id)sender {
#pragma mark--------1.获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_XML" ofType:@"txt"];
#pragma mark--------2.根据文件路径来创建data对象
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
#pragma mark--------3.根据data对象创建解析对象
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
#pragma mark--------4.设置代理
parser.delegate = self;
#pragma mark--------5.开始解析
[parser parse];
}
#pragma mark================== SAX 执行代理方法步骤 =====================
//1.开始文档解析
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
//准备数据
//每次分配的内存是前一次的2倍,如第一次分配了6个,第二次分配6*2=12个,第三次分配12*2=24个
_array = [[NSMutableArray alloc] initWithCapacity:6];
}
//2.开始标签解析
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//记录当前标签
_currentElement = elementName;
//根据标签建立model
if([elementName isEqualToString:@"student"])
{
Student *student = [Student new];
[_array addObject:student];
}
}
//3.获取标签内容
//string:代表的是标签的内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//获取数组最后一个元素
Student *student = _array.lastObject;
//KVC赋值
[student setValue:string forKey:_currentElement];
}
//4.结束标签解析
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//当前存储节点置为空,不影响下次判断
_currentElement = nil;
}
#pragma mark---------------实际开发中可以不写,5.6两步只是作为调试,项目上线时不用些
//5.结束文档解析
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
//校验数据
for (Student *student in _array) {
NSLog(@"%@",student);
}
}
//6.错误处理
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"写错了,错误为%@",parseError);
}
DOM解析:Document Object Model(文档对象模型)
解析时需要将XML问价整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据。
DOM的解析方法:要导入GDataXMLNode的.h和.m文件
- (IBAction)xmlDOMAction:(UIButton *)sender {
//1.获取文件路径
//获取当前的应用程序包
NSBundle *boundle = [NSBundle mainBundle];
//根据包获取文件路径
NSString *path = [boundle pathForResource:@"StudentInfo_XML" ofType:@"txt"];
//2.根据文件路径创建data对象
NSData *data = [NSData dataWithContentsOfFile:path];
//3.创建解析对象
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
//4.获取根节点
GDataXMLElement *rootElement = [document rootElement];
//创建存放学生对象的数组
_array = [[NSMutableArray alloc] initWithCapacity:6];
for (GDataXMLElement *subElement in rootElement.children) {
//创建学生对象
Student *student = [Student new];
for (GDataXMLElement *element in subElement.children) {
//获取学生对象的属性
[student setValue:element.stringValue forKey:element.name];
}
//将学生对象加入数组中
[_array addObject:student];
}
//校验
for (int i = 0; i < _array.count; i++) {
NSLog(@"%@",_array[i]);
}
}
//注意:XML数据解析用于大型数据中,现在不太常用了哦.
StudentInfo_XML文件:
<Students>
<student>
<name>刘爽</name>
<age>18</age>
<gender>male</gender>
<hobby>孙聚德</hobby>
<phone>18791696178</phone>
</student>
<student>
<name>张国城</name>
<age>19</age>
<gender>male</gender>
<hobby>张飞</hobby>
<phone>15650779772</phone>
</student>
<student>
<name>杨小龙</name>
<age>23</age>
<gender>male</gender>
<hobby>LOL,购物,散打</hobby>
<phone>13666666666</phone>
</student>
<student>
<name>袁海洋</name>
<age>2</age>
<gender>male</gender>
<hobby>女</hobby>
<phone>18390679292</phone>
</student>
<student>
<name>李宝剑</name>
<age>20</age>
<gender>male</gender>
<hobby>iOS Teacher</hobby>
<phone>183906792921</phone>
</student>
<student>
<name>潘浩</name>
<age>22</age>
<gender>female</gender>
<hobby>iOS</hobby>
<phone>15033351572</phone>
</student>
</Students>
主要代码:
数据模型类:
Student.h文件中
@interface Student : NSObject
//声明属性
@property(nonatomic,copy) NSString *name;
@property(nonatomic,assign) NSInteger age;
@property(nonatomic,copy) NSString *gender;
@property(nonatomic,copy) NSString *hobby;
@property(nonatomic,copy) NSString *phone;
@end
.m文件中
#pragma mark------------防止KVC出错
-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{
//1.防止键用了关键字
if ([key isEqualToString:@"int"]) {
_age = [value integerValue];
//2.防止key值书写错误
NSLog(@"%@",key);
}
}
#pragma mark----------debug模式校验对象(实际开发中不用写,只是在调试时用)
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld,gender:%@,hobby:%@,phone:%@",_name,_age,_gender,_hobby,_phone];
}
SAX:Simple API for XML :基于事件驱动的解析方式,逐行解析数据。(采用协议回调机制)
解析过程:开始标签->取值->结束标签->取值
SAX方法解析的主要代码:
视图控制器的.m文件中
@interface ViewController ()<NSXMLParserDelegate>
#pragma mark--------声明一个盛放model对象的数组
@property(nonatomic,strong) NSMutableArray *array;
#pragma mark--------当前节点
@property(nonatomic,strong) NSString *currentElement;
@end
- (IBAction)xmlSAXAction:(id)sender {
#pragma mark--------1.获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_XML" ofType:@"txt"];
#pragma mark--------2.根据文件路径来创建data对象
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
#pragma mark--------3.根据data对象创建解析对象
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
#pragma mark--------4.设置代理
parser.delegate = self;
#pragma mark--------5.开始解析
[parser parse];
}
#pragma mark================== SAX 执行代理方法步骤 =====================
//1.开始文档解析
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
//准备数据
//每次分配的内存是前一次的2倍,如第一次分配了6个,第二次分配6*2=12个,第三次分配12*2=24个
_array = [[NSMutableArray alloc] initWithCapacity:6];
}
//2.开始标签解析
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//记录当前标签
_currentElement = elementName;
//根据标签建立model
if([elementName isEqualToString:@"student"])
{
Student *student = [Student new];
[_array addObject:student];
}
}
//3.获取标签内容
//string:代表的是标签的内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//获取数组最后一个元素
Student *student = _array.lastObject;
//KVC赋值
[student setValue:string forKey:_currentElement];
}
//4.结束标签解析
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//当前存储节点置为空,不影响下次判断
_currentElement = nil;
}
#pragma mark---------------实际开发中可以不写,5.6两步只是作为调试,项目上线时不用些
//5.结束文档解析
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
//校验数据
for (Student *student in _array) {
NSLog(@"%@",student);
}
}
//6.错误处理
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"写错了,错误为%@",parseError);
}
DOM解析:Document Object Model(文档对象模型)
解析时需要将XML问价整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据。
DOM的解析方法:要导入GDataXMLNode的.h和.m文件
- (IBAction)xmlDOMAction:(UIButton *)sender {
//1.获取文件路径
//获取当前的应用程序包
NSBundle *boundle = [NSBundle mainBundle];
//根据包获取文件路径
NSString *path = [boundle pathForResource:@"StudentInfo_XML" ofType:@"txt"];
//2.根据文件路径创建data对象
NSData *data = [NSData dataWithContentsOfFile:path];
//3.创建解析对象
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
//4.获取根节点
GDataXMLElement *rootElement = [document rootElement];
//创建存放学生对象的数组
_array = [[NSMutableArray alloc] initWithCapacity:6];
for (GDataXMLElement *subElement in rootElement.children) {
//创建学生对象
Student *student = [Student new];
for (GDataXMLElement *element in subElement.children) {
//获取学生对象的属性
[student setValue:element.stringValue forKey:element.name];
}
//将学生对象加入数组中
[_array addObject:student];
}
//校验
for (int i = 0; i < _array.count; i++) {
NSLog(@"%@",_array[i]);
}
}
//注意:XML数据解析用于大型数据中,现在不太常用了哦.
相关文章推荐
- Shell基础-Bash变量-用户自定义变量
- Python爬虫的一些总结
- 零碎知识点(未分类)
- HTTPS协议简介
- linux c 获取硬盘序列号
- 杭电acm1302
- Java-递归算法思想
- 15_10_4
- 连接线程与等待一个对象
- Session的用法(代码解析)
- 利用Collections类操作链表(排序,反转等)
- IOS开发笔记 ——@dynamic 和 @synthesize 和区别
- Cntlm安装和配置体验
- Swift过程控制和功能
- ubuntu+nginx+supervisor部署tornado
- 2015 网赛 北京 - B Mission Impossible 6 模拟
- Spring S2SH框架整合(一)
- 数据库连接泄露的问题
- 138. Copy List with Random Pointer (Graph, Map; DFS)
- Linux中ifcfg-eth0配置参数说明