XML解析(DOM)

XML文件解析方法介绍

我们所用到的NSXMLParser是采用SAX方法解析

SAX(Simple API for XML)
  • 只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
  • 常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
  • 从文档的开始通过每一节点移动,定位一个特定的节点
DOM(Document Object Model)
  • 不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
  • 一般应用与小型的配置XML,方便操作
  • 为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
  • 在内存中生成节点树操作代价昂贵

NSXMLParser解析

1.创建NSXMLParser实例,并传入从服务器接收的XML数据
 
2.定义解析器代理
 
3.解析器解析
 
4.通过解析代理方法完成XML数据的解析
 
使用XML解析文档时使用协议<NSXMLParserDelegate>,实现它的代理方法

1. 开始解析某个元素,会遍历整个XML,识别元素节点名称

- (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:

2. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销

- (void)parser:foundCharacters:

3. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息

- (void)parser:didEndElement:namespaceURI:qualifiedName:

注意:在解析过程中,上述三个方法会不停的重复执行,直到遍历完成为止

4. 开始解析XML文档

- (void)parserDidStartDocument:

5. 解析XML文档结束

- (void)parserDidEndDocument:

6. 解析出错

- (void)parser:parseErrorOccurred:
 
在XMLParser解析过程中,还需要实现NSXMLParserDelegate代理方法
如果一个XML文件中包含多个对象在解析过程中,为了能够正确解析中文档中的数据,需要注意一下几点:
1.当前解析出得是对象还是元素值?
如果是对象,需要判断当前对象时第几个,是第一个对象,还是第二、第三……,如果是第N个,需要将第N-1的对象值取出保存。
如果是元素值,需要将解析出得数据,赋值给对应于对象的某个属性。
2.在解析过程中,每次读取的是一个字符,所有必须实现字符串的拼接过程,将解析出字符进行组合。用来判断当前解析出得是对象,还是元素名。或元素值。
 

XML(DOM)具体步骤

1.在github上下载GDataXMLNode

2.配置第三方

3.使用GDataXMLNode解析XML数据

- 下载大家应该都会把,不用我教,直接来第二步

点击工程名字,然后如下图所示添加代码,然后我们的第三方库就可以使用了

第三步:进行XML解析数据-这儿直接上代码,注释也挺详细的,相信你们都可以看懂

viewCOntroller

 //
// ViewController.m
// XML(DOM解析)
//
// Created by ma c on 16/3/19.
// Copyright (c) 2016年 姬凯鹏. All rights reserved.
// #import "ViewController.h"
#import "JKPTrainInfo.h"
#import "GDataXMLNode.h"
@interface ViewController ()<UITableViewDataSource> @property (nonatomic, strong) NSMutableArray * dataList; @property (nonatomic,strong) UITableView *tableView; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. [self initUI]; [self loadData];
} #pragma mark -getter and setter methods - (NSMutableArray *)dataList { if (!_dataList) {
_dataList = [NSMutableArray array];
}
return _dataList;
} -(UITableView *)tableView
{
if (!_tableView) { _tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; _tableView.dataSource = self;
}
return _tableView;
} #pragma mark - UITableView dataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataList.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString * identifiter = @"cellID"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:identifiter]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifiter];
}
JKPTrainInfo *JkpInfo = self.dataList[indexPath.row]; cell.textLabel.text = JkpInfo.trainStation; cell.detailTextLabel.text = JkpInfo.arriveTime; return cell;
} #pragma mark - event handle methods
// 载入数据
- (void)loadData
{
NSURL *url = [NSURL URLWithString:@"http://192.168.1.68/train.xml"]; NSURLRequest *requst = [NSURLRequest requestWithURL:url]; [NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { //根据数据生成xml解析文档
GDataXMLDocument *gData = [[GDataXMLDocument alloc]initWithData:data error:nil];
//获取xml根节点下所有子节点
for (GDataXMLElement *element in gData.rootElement.children) { //获取子节点下的孙子节点
for (GDataXMLElement * trainInfo in element.children) { //创建模型
JKPTrainInfo *info = [[JKPTrainInfo alloc]init]; // 经检测 stringValue是数据 name是节点的名字 GDataXMLElement是节点下的数据部分 //即这个<trainStation>上海南(车次:T81\T80)</trainStation>
for (GDataXMLElement *note in trainInfo.children) { [info setValue:note.stringValue forKey:note.name]; // NSLog(@"%@",note.stringValue);
//
// NSLog(@"-----------");
//
// NSLog(@"%@",note.name);
} //GDataXMLNode *att 是XML文件中这个 <trainDetailInfo info="trainDetailInfo1" rowOrder="0" hasChanges="inserted">
for (GDataXMLNode *att in trainInfo.attributes ) { [info setValue:att.stringValue forKey:att.name]; NSLog(@"%@",att.stringValue); NSLog(@"-----------"); NSLog(@"%@",att.name); }
//将模型加入到数据中
[self.dataList addObject:info];
} }
//刷新数据 一定要在异步请求里面刷新数据 不然不好使
[self.tableView reloadData]; }];
} //载入视图
- (void)initUI
{
[self.view addSubview:self.tableView];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

mode类

//
// JKPTrainInfo.h
// XML解析(SAX)练习
//
// Created by ma c on 16/3/19.
// Copyright (c) 2016年 姬凯鹏. All rights reserved.
// #import <Foundation/Foundation.h> @interface JKPTrainInfo : NSObject
//解析数据
@property (nonatomic, copy) NSString * info;
@property (nonatomic, copy) NSString * rowOrder;
@property (nonatomic, copy) NSString * hasChanges; @property (nonatomic, copy) NSString * trainStation;
@property (nonatomic, copy) NSString * arriveTime;
@property (nonatomic, copy) NSString * startTime;
@property (nonatomic, copy) NSString * KM; @end

XML解析之DOM详解及与SAX解析方法的比较的更多相关文章

  1. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  2. Day04 dom详解及js事件

    day04 dom详解 DOM的基础 Document对象 Element对象 Node对象 innerHTML 事件处理 表单验证   上次课内容回顾: JS中ECMAScript用法: JS定义变 ...

  3. SpringBoot之DispatcherServlet详解及源码解析

    在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...

  4. JavaScript进阶内容——DOM详解

    JavaScript进阶内容--DOM详解 当我们已经熟练掌握JavaScript的语法之后,我们就该进入更深层次的学习了 首先我们思考一下:JavaScript是用来做什么的? JavaScript ...

  5. 谷歌地图地理解析和反解析geocode.geocoder详解

    地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国 ...

  6. XML参考 :XmlReader 详解、实例

    XML参考 :XmlReader 详解.实例-- 详解 转:http://www.cnblogs.com/Dlonghow/archive/2008/07/28/1252191.html XML参考 ...

  7. 虚拟DOM详解

    虚拟DOM简介 Virtual Dom可以看做一棵模拟了DOM树的JavaScript对象树,其主要是通过vnode,实现一个无状态的组件,当组件状态发生更新时,然后触发Virtual Dom数据的变 ...

  8. Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. 浏览器解析html全过程详解

    前端文摘:深入解析浏览器的幕后工作原理 关于浏览器解析html全过程详解 输入URL到浏览器接收返回的数据的整个过程 TCP报文格式详解 IP报文格式详解 Linux IO模式及 select.pol ...

随机推荐

  1. qt 窗口动画

    窗口动画 编辑删除转载 2015-10-10 14:50:27 标签:qt渐变动画 一个应用程序通常包含多个动画,例如,你可能希望同时移动许多graphic items或者一个个按照串行的方式的移动他 ...

  2. ASP.NET MVC使用SSI来实现页面静态化

    页面静态化分为两种:伪静态和真静态,这里主要介绍的是真静态. 进入正题之前先简单介绍一下SSI和shtml: 1).SSI是Server Side Include的简称(服务器端嵌入) 2).shtm ...

  3. HoverTree项目添加了查看留言列表功能

    HoverTree项目添加了查看留言列表功能 页面:HoverTreeWeb项目下hvtpanel/usermessage/messagelist.aspx 添加留言页面:addmessage.asx ...

  4. SingalR--介绍

    什么是SignalR? ASP.NET SignalR是为简化开发开发人员将实时web内容添加到应用程序过程而提供的类库.实时web功能指的是让服务器代码可以随时主动推送内容给客户端,而不是让服务器等 ...

  5. 走进异步世界-犯傻也值得分享:ConfigureAwait(false)使用经验分享

    在上周解决“博客程序异步化改造之后遭遇的性能问题”的过程中,我们干了一件自以为很有成就感的事——在表现层(MVC与WebForms)将所有使用await的地方都加上了ConfigureAwait(fa ...

  6. CentOS 配置防火墙操作实例(启、停、开、闭端口)

    防火墙的基本操作命令 查询防火墙状态:[root@localhost ~]# service   iptables status<回车> 停止防火墙:[root@localhost ~]# ...

  7. 精品干货丨APP常用导航框架

    文章目的:在整体上把握移动端App的导航框架,理解每种导航所具有的优点.局限性和其所适用的范围. 文章用心:典型APP案例(源码:http://www.jinhusns.com/Products/Do ...

  8. spread表格树实现

    先上图看下效果图: 玩表格的朋友应该对Component和C1Flexgrid并不陌生吧.其实我也有用C1和DGV扩展了一个表格树,占有内存小,效率也可以,但是UI是硬伤,中规中矩,不美观.我上面是基 ...

  9. 2016暑假多校联合---A Simple Chess

    2016暑假多校联合---A Simple Chess   Problem Description There is a n×m board, a chess want to go to the po ...

  10. Java集合类中的哈希总结

    JAVA集合类中的哈希总结 目 录 1.哈希表 2.Hashtable.HashMap.ConcurrentHashMap.LinkedHashMap.TreeMap区别 3.Hashtable.Ha ...