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

  1. //
  2. // ViewController.m
  3. // XML(DOM解析)
  4. //
  5. // Created by ma c on 16/3/19.
  6. // Copyright (c) 2016年 姬凯鹏. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10. #import "JKPTrainInfo.h"
  11. #import "GDataXMLNode.h"
  12. @interface ViewController ()<UITableViewDataSource>
  13.  
  14. @property (nonatomic, strong) NSMutableArray * dataList;
  15.  
  16. @property (nonatomic,strong) UITableView *tableView;
  17.  
  18. @end
  19.  
  20. @implementation ViewController
  21.  
  22. - (void)viewDidLoad {
  23. [super viewDidLoad];
  24. // Do any additional setup after loading the view, typically from a nib.
  25.  
  26. [self initUI];
  27.  
  28. [self loadData];
  29. }
  30.  
  31. #pragma mark -getter and setter methods
  32.  
  33. - (NSMutableArray *)dataList {
  34.  
  35. if (!_dataList) {
  36. _dataList = [NSMutableArray array];
  37. }
  38. return _dataList;
  39. }
  40.  
  41. -(UITableView *)tableView
  42. {
  43. if (!_tableView) {
  44.  
  45. _tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
  46.  
  47. _tableView.dataSource = self;
  48. }
  49. return _tableView;
  50. }
  51.  
  52. #pragma mark - UITableView dataSource
  53.  
  54. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  55.  
  56. return self.dataList.count;
  57. }
  58.  
  59. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  60.  
  61. static NSString * identifiter = @"cellID";
  62.  
  63. UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:identifiter];
  64.  
  65. if (!cell) {
  66.  
  67. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifiter];
  68. }
  69. JKPTrainInfo *JkpInfo = self.dataList[indexPath.row];
  70.  
  71. cell.textLabel.text = JkpInfo.trainStation;
  72.  
  73. cell.detailTextLabel.text = JkpInfo.arriveTime;
  74.  
  75. return cell;
  76. }
  77.  
  78. #pragma mark - event handle methods
  79. // 载入数据
  80. - (void)loadData
  81. {
  82. NSURL *url = [NSURL URLWithString:@"http://192.168.1.68/train.xml"];
  83.  
  84. NSURLRequest *requst = [NSURLRequest requestWithURL:url];
  85.  
  86. [NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  87.  
  88. //根据数据生成xml解析文档
  89. GDataXMLDocument *gData = [[GDataXMLDocument alloc]initWithData:data error:nil];
  90. //获取xml根节点下所有子节点
  91. for (GDataXMLElement *element in gData.rootElement.children) {
  92.  
  93. //获取子节点下的孙子节点
  94. for (GDataXMLElement * trainInfo in element.children) {
  95.  
  96. //创建模型
  97. JKPTrainInfo *info = [[JKPTrainInfo alloc]init];
  98.  
  99. // 经检测 stringValue是数据 name是节点的名字 GDataXMLElement是节点下的数据部分
  100.  
  101. //即这个<trainStation>上海南(车次:T81\T80)</trainStation>
  102. for (GDataXMLElement *note in trainInfo.children) {
  103.  
  104. [info setValue:note.stringValue forKey:note.name];
  105.  
  106. // NSLog(@"%@",note.stringValue);
  107. //
  108. // NSLog(@"-----------");
  109. //
  110. // NSLog(@"%@",note.name);
  111. }
  112.  
  113. //GDataXMLNode *att 是XML文件中这个 <trainDetailInfo info="trainDetailInfo1" rowOrder="0" hasChanges="inserted">
  114. for (GDataXMLNode *att in trainInfo.attributes ) {
  115.  
  116. [info setValue:att.stringValue forKey:att.name];
  117.  
  118. NSLog(@"%@",att.stringValue);
  119.  
  120. NSLog(@"-----------");
  121.  
  122. NSLog(@"%@",att.name);
  123.  
  124. }
  125. //将模型加入到数据中
  126. [self.dataList addObject:info];
  127. }
  128.  
  129. }
  130. //刷新数据 一定要在异步请求里面刷新数据 不然不好使
  131. [self.tableView reloadData];
  132.  
  133. }];
  134. }
  135.  
  136. //载入视图
  137. - (void)initUI
  138. {
  139. [self.view addSubview:self.tableView];
  140. }
  141. - (void)didReceiveMemoryWarning {
  142. [super didReceiveMemoryWarning];
  143. // Dispose of any resources that can be recreated.
  144. }
  145.  
  146. @end

mode类

  1. //
  2. // JKPTrainInfo.h
  3. // XML解析(SAX)练习
  4. //
  5. // Created by ma c on 16/3/19.
  6. // Copyright (c) 2016年 姬凯鹏. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10.  
  11. @interface JKPTrainInfo : NSObject
  12. //解析数据
  13. @property (nonatomic, copy) NSString * info;
  14. @property (nonatomic, copy) NSString * rowOrder;
  15. @property (nonatomic, copy) NSString * hasChanges;
  16.  
  17. @property (nonatomic, copy) NSString * trainStation;
  18. @property (nonatomic, copy) NSString * arriveTime;
  19. @property (nonatomic, copy) NSString * startTime;
  20. @property (nonatomic, copy) NSString * KM;
  21.  
  22. @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. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  2. DirectShowLib directshownet 视频

    using DirectShowLib; using System; using System.Collections; using System.Windows.Forms; namespace C ...

  3. 基于MVC4+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录

    最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重 ...

  4. WinPhone学习笔记(五)——LongListSelector

    LongListSelector也是WinPhone的特色控件之一,最初不了解这个控件叫啥名,知道它会在"人脉"里面出现,在应用程序列表也是这个LongListSelector(如 ...

  5. 【vbs】vbs写ini文件

    这两天在折腾给一个项目打安装包,第一次接触软件打包,用的Advanced Installer(以下简称AI),应该说如果安装过程没有特殊动作(常规动作指释放文件.写注册表.建快捷方式等)的话,倒挺傻瓜 ...

  6. 自己动手,让Entity Framework Power Tools在VS2015重放光彩

    Entity Framework Power Tools是一个由EntityFramework开发小组提供的工具,它可以从现有数据库生成Fluent款式的Code First代码. VS Galler ...

  7. Wijmo 2016 V1 强势发布,全面支持Angular 2

    Wijmo UI控件支持Angular 2 从Angular的1.x时代开始,Wijmo就已经支持Angular了.最近,我们正在和Angular团队合作来支持Angular 2.有趣的是,对Angu ...

  8. [修复] Firemonkey 画线问题(Android & iOS 平台)

    问题:官方 QC 的一个 Firemonkey 移动平台画线问题: RSP-14309: [iOS & Android] Delphi 10.1 Berlin - drawing proble ...

  9. AngularJS例子 ng-repeat遍历输出 通过js的splice方法删除当前行

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Linux命令详解之—more命令

    Linux more命令同cat命令一样,多用来查看文件内容,本文就为大家介绍下Linux more命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux的more命令类似 ca ...