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. Web Scraping with Python读书笔记及思考

    Web Scraping with Python读书笔记 标签(空格分隔): web scraping ,python 做数据抓取一定一定要明确:抓取\解析数据不是目的,目的是对数据的利用 一般的数据 ...

  2. Vim快捷键分类

      别用ESC了,用ctrl-[ 更快捷   一. 移动:    h,j,k,l: 左,下,上,右.    w: 下一个词的词首.    e:下一个词的词尾.    b:上一个词的词首.    < ...

  3. rtf格式的一些说明,转载的

    RTF是Rich TextFormat的缩写,意即多文本格式.这是一种类似DOC格式(Word文档)的文件,有很好的兼容性,使用Windows"附件"中的"写字板&quo ...

  4. 【转】nginx+iis实现负载均衡

    最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存redis等.本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名称为Load Balance,其 ...

  5. Dapper学习 - Dapper.Rainbow(一) - Create

    Dapper这个ORM有许多扩展, 我自己用过两种, 也算是比较主流的两种, Rainbow和Extension, 这里就先介绍下Rainbow吧, 毕竟这个先用, 当然, 由于我使用的是mysql数 ...

  6. jquery的promise实践--连续加载图片

    在javascript设计模式实践之代理模式--图片预加载中用代理模式实现了图片预加载功能. 现在就更进一步,完成一个能够一张一张的连续图片加载的功能. 功能: 1.一张一张加载图片. 2.加载错误, ...

  7. [转] MySql 优化 大数据优化

    一.我们可以且应该优化什么? 硬件 操作系统/软件库 SQL服务器(设置和查询) 应用编程接口(API) 应用程序 ------------------------------------------ ...

  8. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现

    今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...

  9. python队列Queue

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  10. 【FOL】第二周

    一直在忙其他事情,停了好久了.终于又可以开始做点东西了. 这周主要工作: 1.整理客户端代码,加入网络模块:fol.client.net. 2.写了个简单的版本服务端程序. 3.初步完成了自动更新功能 ...