XML解析之DOM详解及与SAX解析方法的比较
XML解析(DOM)
XML文件解析方法介绍
我们所用到的NSXMLParser是采用SAX方法解析
- 只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
- 常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
- 从文档的开始通过每一节点移动,定位一个特定的节点
- 不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
- 一般应用与小型的配置XML,方便操作
- 为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
- 在内存中生成节点树操作代价昂贵
NSXMLParser解析
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. 解析出错
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解析方法的比较的更多相关文章
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Day04 dom详解及js事件
day04 dom详解 DOM的基础 Document对象 Element对象 Node对象 innerHTML 事件处理 表单验证 上次课内容回顾: JS中ECMAScript用法: JS定义变 ...
- SpringBoot之DispatcherServlet详解及源码解析
在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...
- JavaScript进阶内容——DOM详解
JavaScript进阶内容--DOM详解 当我们已经熟练掌握JavaScript的语法之后,我们就该进入更深层次的学习了 首先我们思考一下:JavaScript是用来做什么的? JavaScript ...
- 谷歌地图地理解析和反解析geocode.geocoder详解
地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国 ...
- XML参考 :XmlReader 详解、实例
XML参考 :XmlReader 详解.实例-- 详解 转:http://www.cnblogs.com/Dlonghow/archive/2008/07/28/1252191.html XML参考 ...
- 虚拟DOM详解
虚拟DOM简介 Virtual Dom可以看做一棵模拟了DOM树的JavaScript对象树,其主要是通过vnode,实现一个无状态的组件,当组件状态发生更新时,然后触发Virtual Dom数据的变 ...
- Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- 浏览器解析html全过程详解
前端文摘:深入解析浏览器的幕后工作原理 关于浏览器解析html全过程详解 输入URL到浏览器接收返回的数据的整个过程 TCP报文格式详解 IP报文格式详解 Linux IO模式及 select.pol ...
随机推荐
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- DirectShowLib directshownet 视频
using DirectShowLib; using System; using System.Collections; using System.Windows.Forms; namespace C ...
- 基于MVC4+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录
最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重 ...
- WinPhone学习笔记(五)——LongListSelector
LongListSelector也是WinPhone的特色控件之一,最初不了解这个控件叫啥名,知道它会在"人脉"里面出现,在应用程序列表也是这个LongListSelector(如 ...
- 【vbs】vbs写ini文件
这两天在折腾给一个项目打安装包,第一次接触软件打包,用的Advanced Installer(以下简称AI),应该说如果安装过程没有特殊动作(常规动作指释放文件.写注册表.建快捷方式等)的话,倒挺傻瓜 ...
- 自己动手,让Entity Framework Power Tools在VS2015重放光彩
Entity Framework Power Tools是一个由EntityFramework开发小组提供的工具,它可以从现有数据库生成Fluent款式的Code First代码. VS Galler ...
- Wijmo 2016 V1 强势发布,全面支持Angular 2
Wijmo UI控件支持Angular 2 从Angular的1.x时代开始,Wijmo就已经支持Angular了.最近,我们正在和Angular团队合作来支持Angular 2.有趣的是,对Angu ...
- [修复] Firemonkey 画线问题(Android & iOS 平台)
问题:官方 QC 的一个 Firemonkey 移动平台画线问题: RSP-14309: [iOS & Android] Delphi 10.1 Berlin - drawing proble ...
- AngularJS例子 ng-repeat遍历输出 通过js的splice方法删除当前行
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Linux命令详解之—more命令
Linux more命令同cat命令一样,多用来查看文件内容,本文就为大家介绍下Linux more命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux的more命令类似 ca ...