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相关推荐

  1. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  2. iOS - XML 数据解析

    前言 @interface NSXMLParser : NSObjectpublic class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mark ...

  3. Android中XML数据解析

    转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML ...

  4. delphi读取xml中的内容property name传递参数_python3 Json和XML数据解析

    一.Json数据解析 Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数: json.dumps(): 对数据进行编码. json.loads(): 对数据进行 ...

  5. 零基础iOS之Json及XML数据解析2

    零基础iOS之Json及XML数据解析http://www.cnblogs.com/dingjianjaja/articles/4798604.html 转载于:https://www.cnblogs ...

  6. Java解析XMl文件之SAX和DOm方法

    如题,这两种方法的jar包都在jdk中,不需要下载. 先来说下目录结构: 首先建一个Peron类封装person.xml的属性:DomParseService和SaxParseService分别为两种 ...

  7. java电台数据解析_Java数据解析---SAX

    一.Sax解析 是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档. Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回 ...

  8. jdk 中常用的 xml 数据解析

    xml(extensible markup language) 是一种可扩展标记语言,允许用户自定义复杂的数据结构,json(javascript object notation),可以认为是 JS ...

  9. iOS边练边学--iOS中的XML数据解析

    XML的解析方式 SAX 大小文件都可以 NSXMLParser DOM 最好是小文件 GDataXML NSXMLParser的用法 创建解析器来解析 // 创建XML解析器 NSXMLParser ...

最新文章

  1. vb调用excel方法详解及操作相关操作命令大全
  2. 一些不是很常用的SQL语句
  3. UA MATH571A 一元线性回归II 统计推断2
  4. 当人工智能遇见农业,农民伯伯不再「粒粒皆辛苦」
  5. Centos服务器时间
  6. C# 窗口全屏 隐藏任务栏 (代码)
  7. HDFS常用文件操作命令汇总
  8. jetty运行web项目
  9. 使用luac编译lua脚本文件[适用于Windows系统]
  10. SQL保姆级教程来了,0基础怎么快速上手sql?面试官会从哪些方面考sql?(看完你就能5天掌握SQL要点)...
  11. 点云学习笔记1——激光雷达的原理
  12. 谷歌将英文网站翻译成中文
  13. wifi6 feature 详解
  14. Ubuntu18.04与RTX1080Ti安装深度学习框架
  15. 基于Javaweb的问卷调查系统
  16. PCIe扫盲——PCIe简介
  17. 形容计算机专业的人词语,形容一个人很专业很厉害的成语有哪些
  18. Rasa原文-编写对话数据
  19. rdo远程计算机需要,Remote Desktop Organizer
  20. CSS-Day03-CSS样式-字体

热门文章

  1. 国家司法考试(法考)成功上岸前辈备考经验分享
  2. 利用HTML完成用户注册界面设计,以及性别复选框、按钮链接跳转的实现
  3. Linux 管理面板云帮手、APPNODE与宝塔哪个好
  4. 联想拯救者y7000p加内存条_联想 拯救者Y7000P 如何插入SD卡?
  5. 外包招聘背调,是对前雇主的一种侮辱
  6. 微信小程序实现:输入手机号点击按钮查询手机号归属地
  7. Android的post请求工具,Android客户端post请求服务器端实例
  8. visio添加外键约束
  9. Android平台WIFI启动流程之二
  10. CSS入门二、美化页面元素