XML数据解析-SAX和DOM
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数据解析用于大型数据中,现在不太常用了哦.
XML数据解析-SAX和DOM相关推荐
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- iOS - XML 数据解析
前言 @interface NSXMLParser : NSObjectpublic class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mark ...
- Android中XML数据解析
转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML ...
- delphi读取xml中的内容property name传递参数_python3 Json和XML数据解析
一.Json数据解析 Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数: json.dumps(): 对数据进行编码. json.loads(): 对数据进行 ...
- 零基础iOS之Json及XML数据解析2
零基础iOS之Json及XML数据解析http://www.cnblogs.com/dingjianjaja/articles/4798604.html 转载于:https://www.cnblogs ...
- Java解析XMl文件之SAX和DOm方法
如题,这两种方法的jar包都在jdk中,不需要下载. 先来说下目录结构: 首先建一个Peron类封装person.xml的属性:DomParseService和SaxParseService分别为两种 ...
- java电台数据解析_Java数据解析---SAX
一.Sax解析 是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档. Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回 ...
- jdk 中常用的 xml 数据解析
xml(extensible markup language) 是一种可扩展标记语言,允许用户自定义复杂的数据结构,json(javascript object notation),可以认为是 JS ...
- iOS边练边学--iOS中的XML数据解析
XML的解析方式 SAX 大小文件都可以 NSXMLParser DOM 最好是小文件 GDataXML NSXMLParser的用法 创建解析器来解析 // 创建XML解析器 NSXMLParser ...
最新文章
- vb调用excel方法详解及操作相关操作命令大全
- 一些不是很常用的SQL语句
- UA MATH571A 一元线性回归II 统计推断2
- 当人工智能遇见农业,农民伯伯不再「粒粒皆辛苦」
- Centos服务器时间
- C# 窗口全屏 隐藏任务栏 (代码)
- HDFS常用文件操作命令汇总
- jetty运行web项目
- 使用luac编译lua脚本文件[适用于Windows系统]
- SQL保姆级教程来了,0基础怎么快速上手sql?面试官会从哪些方面考sql?(看完你就能5天掌握SQL要点)...
- 点云学习笔记1——激光雷达的原理
- 谷歌将英文网站翻译成中文
- wifi6 feature 详解
- Ubuntu18.04与RTX1080Ti安装深度学习框架
- 基于Javaweb的问卷调查系统
- PCIe扫盲——PCIe简介
- 形容计算机专业的人词语,形容一个人很专业很厉害的成语有哪些
- Rasa原文-编写对话数据
- rdo远程计算机需要,Remote Desktop Organizer
- CSS-Day03-CSS样式-字体