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. noip模拟赛 纸壳子

    Task 1.纸壳子(box.pas/box.c/box.cpp) [题目描述] Mcx是一个有轻度洁癖的小朋友.有一天,当他沉溺于数学卷子难以自拔的时候,恍惚间想起在自己当初学习概率的时候准备的一堆 ...

  2. StgCreateDocfileOnILockBytes复合文档

    CRichEditCtrl 的ole技术 ------------ IRichEditOle --------------------------- 如需向CRichEditCtrl里面插入Ole对象 ...

  3. Emit学习(3) - OpCodes - 循环和异常

    本来准备直接进入Dapper的, 但是昨天初步看了一下, 内容不少, Dapper不愧是一款成熟的框架, 里面对各种情况的考虑, 很实用, 不过这也使得我短时间内看不完, 所以得等几天了. 那就先来看 ...

  4. 基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自动适应宽带高度

    在默认情况下,EasyUI的DataGrid好像都没有具备自动宽度的适应功能,一般是指定像素宽度的,但是使用的人员计算机的屏幕分辨率可能不一样,因此导致有些地方显示太大或者太小,总是不能达到好的预期效 ...

  5. C#再识委托

    从C#1到C#3逐步认识委托,由于C#4与C#5对委托改动并不大,故不作说明. 好久没看.NET了,一直在搞HybridAPP,都忘得差不多了,这也是自己从书中摘下笔迹,供日后翻阅. C# 1 1.什 ...

  6. 清除Windows的DNS缓存

    最近ESET杀毒软件老是提示受到DNS缓存攻击,然后就不能打开网页,或者打开得很慢.这是由于缓存的DNS被更改,访问的是错误的IP地址造成的. 解决的办法就是清除DNS缓存,打开DOS命令窗口,先后输 ...

  7. 泛函编程(32)-泛函IO:IO Monad

    由于泛函编程非常重视函数组合(function composition),任何带有副作用(side effect)的函数都无法实现函数组合,所以必须把包含外界影响(effectful)副作用不纯代码( ...

  8. AppleDoc的安裝使用

    前言,還是那句話,新手按照濤叔下面畫黃色的步驟順序執行就好了,不要問為什麼. 一.安裝(注意,濤叔事先已經下載了appledoc) 1.找到下載的appledoc目錄 $ cd /Users/libo ...

  9. FHS定义的Linux目录树

    根目录/: 最重要的一个目录,与开机/修复/还原有关.该目录所在的分区越小越好,安装的程序也最好不要放在该分区内. 根目录下必须存在的子目录: 目录 说明 /bin 存放了很多常用命令,能被root和 ...

  10. mac下彻底卸载mysql方法

    sudo rm /usr/local/mysqlsudo rm -rf /usr/local/mysql*sudo rm -rf /Library/StartupItems/MySQLCOMsudo ...