您的位置:首页 > 其它

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数据解析用于大型数据中,现在不太常用了哦.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: