首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS开发——解析XML数据

iOS开发——解析XML数据

作者头像
我只不过是出来写写代码
发布于 2019-04-02 07:00:37
发布于 2019-04-02 07:00:37
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

移动端开发中,与后台服务数据请求打交道,现在通常是以JSON格式数据进行处理交互。最近碰到一个项目,后台数据交互返回XML格式数据,很久没有接触此类数据了,稍微记录下。 解析XML数据时,使用的是XMLReader第三方框架。该框架中的解析数据方法非常简单。

该框架本身提供了四种方法,以传入NSData与NSString格式的XML数据进行解析,并返回一个数据字典。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+ (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)errorPointer;
+ (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)errorPointer;
+ (NSDictionary *)dictionaryForXMLData:(NSData *)data options:(XMLReaderOptions)options error:(NSError **)errorPointer;
+ (NSDictionary *)dictionaryForXMLString:(NSString *)string options:(XMLReaderOptions)options error:(NSError **)errorPointer;

出于技术开发的特性,习惯性的进入该框架实现中,探究一下实现该框架的原理。

实现关键方法

通过上图可以发现,本身是使用了iOS原生提供的NSXMLParser类相关方法进行XML数据解析。

稍微记录一下NSXMLParser的实现过程 在NSXMLParser的代理方法中,当解析器遇到XML的根标签、数据信息中的开始标签时,会执行以下方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;

开始代理实现

创建了一个堆栈字典dictionaryStack,用于管理每次执行解析代理时的新数据。 首先,在堆栈中获取当前level的字典parentDict,并将代理返回的attributeDict字典拼接到一个可变字典childDict中。 以代理方法返回的elementName为key,判断parentDict字典中是否存在以elementName为key的value。 若不存在,则在parentDict中更新elementName为key的属性,并将childDict保存。 当存在时,再继续判断是否为数组类型。若为数组,则直接在数组中添加childDict字典;若不为数组时,则创建一个新可变数组并把existingValue存入,同时将parentDict中的elementName键值替换为新创建的可变数组。 最后将childDict添加至dictionaryStack

拼接key

这个代理方法中,在获取一个标签首尾间的字符数据时,这个方法可能被调用多次。要获取完整的数据,就需要使用append方法来拼接,并存入textInProgress

结束代理实现

当前解析器执行到结束标签时,会执行- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;方法。 从dictionaryStack中获取最后一个元素,将标签首尾间的字符串进行过滤,并添加字典以text为key,键值为textInProgress。最后将textInProgress重置,并移除dictionaryStack最后一个元素。 XMLReader第三方库代码已经许久不更新了,内存管理也是基于MRC管理,如果有效率更高、更稳定的其它解析框架,欢迎补充。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.05.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS - - JSON 和 XML解析
JSON 和 XML 一、JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的注意点:key必须用双引号 要想从JSON中挖掘出具体数据,得对JSON进行解析 JSON OC 大括号{} NSDictionary
用户1941540
2018/05/11
2.5K0
XML解析方式及GData框架使用一、概念二、XML解析SAM方式(只读)三、DOM方式解析(可读写)四、GData写入功能,生成XML
一、概念 1、XML概念: Extensible Markup Language(可扩展标记语言) HTML (超文本标记语言) 非常类似于HTML,HTML的作用是显示数据,XML的目的是存储和传输数据 XML是以前各种应用之间传输数据最常用的格式 W3C的推荐标准 2、语法 <Class className="三年一班"> <Person color="yellow" weight="130" height="150"> <name>wg</name> <age>108</
用户2141756
2018/05/18
1.3K0
ios网络编程学习
在网络编程中,从服务器获取的数据格式大致分为两种:JSON和XML。其中JSON作为一种轻量级的数据交换格式,正在逐步取代XML, 成为网络数据的通用格式。
tandaxia
2018/09/27
8600
ISO swift下XML数据解析
import UIKit class ViewController: UIViewController ,NSXMLParserDelegate{ override func viewDidLoad() { super.viewDidLoad() //创建XMLParser对象,传入XML格式的数据文件 // var parser=NSXMLParser(contentsOfURL: NSURL(fileURLWithPath: NS
用户7108768
2021/10/29
1.2K0
iOS-网络编程(一)HTTP协议
一. 网络编程基础 在移动互联网时代,几乎所有应用都需要用到网络,只有通过网络跟外界进行数据交互、数据更新,应用才能保持新鲜、活力。一个好的移动网络应用不仅要有良好的UI和良好的用户体验也要具备实时更新数据的能力。网络编程便是一种实时更新应用数据的常用手段也是开发优秀网络应用的前提和基础。 1. 在网络编程中,有几个必须掌握的基本概念 客户端(Client):移动应用(iOS、android等应用) 服务器(Server):为客户端提供服务、提供数据、提供资源的机器 请求(Request):客户端向服务
xx_Cc
2018/05/10
1.8K0
ios swift模仿qq登陆界面,xml布局
极客学院的视频:http://www.jikexueyuan.com/path/ios/
流川疯
2022/05/06
2.3K0
ios swift模仿qq登陆界面,xml布局
[swift]读取svg图片为UIBezierPath,开心做动画
最近手痒又想整点动画玩玩,但是想了几个主意发现稍微复杂一点的手写都一定会累爆。这篇文章记录一下今天折腾的一个方案。说来简单,就是用矢量设计工具舒舒服服的做好设计,然后输出成 svg 格式,再用 NSXMLParser 去读出来,转换成 UIBezierPath ,然后就天高任鸟飞~
Alan Zhang
2018/10/19
1.8K0
[swift]读取svg图片为UIBezierPath,开心做动画
【IOS】AFNetworking 2.0中XML请求处理专题
因为AFNetworking2.0中,对于响应返回的xml格式没有做专门的解析处理,因此需要开发者自己来做处理。在笔者的项目中,使用了一个叫AFGDataXMLRequestOperation的第三方类库来统一处理。
江中散人_Jun
2022/03/08
5290
【iOS】XML解析导致的卡顿问题
笔者在公司项目中,需要解析一个200K左右的XML文件(有3000个XML结点),发现解析会导致整个App卡顿。于是猜想是不是在主线程中进行了解析,导致卡顿。因此,xml的代理方法didStartElement,即以下方法,打印了当前线程,发现代理是异步执行的,就以为不是这个问题了。
MapleYe
2020/03/30
4740
iOS开发--服务器返回的数据解析
App要与服务器交互才能达到数据更新和获取资源 那么: 服务器返回客户端的数据,一般返回两种格式:JSON格式、XML格式 (文件下载除外)
孙寅
2020/06/02
2.6K0
iOS开发之蓝牙通讯 原
        蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单。相关的蓝牙操作由专门的CoreBluetooth.framework进行统一管理。通过蓝牙进行通讯交互分为两方,一方为中心设备central,一方为外设peripheral,外设通过广播的方式向外发送信息,中心设备检索到外设发的广播信息,可以进行配对连接,进而进行数据交互。
珲少
2018/08/15
1.3K0
IOS开发系列—Objective-C之Foundation框架
概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底是谁?它为什么又出现在Objective-C中间呢?今天我们将揭开这层面纱,重点分析在IOS开发中一个重要的框架Foundation,今天的主要内容有: 1. Foundation概述 2. 常用结构体 3. 日期 4. 字符串 5. 数组 6. 字典 7. 装箱和拆箱 8. 反射 9. 拷贝 10. 文件操作
用户1941540
2018/06/20
8410
IOS开发之新浪围脖
  IOS开发和Web开发一样,网络请求方式包括Get和Post方式。Get和Post两者有和特点和区别,在本篇博客中不做过多的论述,本篇的重点在于如何GET数据和POST数据。下面还会提到如何在我们的项目中使用CocoaPods, CocoaPods的安装和使用教程请参考链接http://code4app.com/article/cocoapods-install-usage。上面详细的介绍了CocoaPods的安装过程和如何通过CocoaPods引入第三方类库。在本篇博客中提到CocoaPods,是因为
lizelu
2018/01/11
1.4K0
IOS开发之新浪围脖
iOS开发·网络请求方法总结复习(NSURLConnection,NSURLSession,AFNetworking)
iOS的开发中的网络下载方式包括NSData(最原始,实际开发基本不会用),NSURLConnection(古老又过气的苹果原生网络框架),NSURLSession(现在流行的苹果网络框架),AFNetworking,SDWebImage以及基于AFNetworking的二次封装框架例如XMNetworking,HYBNetworking等等。
陈满iOS
2018/09/10
3.6K0
iOS开发·网络请求方法总结复习(NSURLConnection,NSURLSession,AFNetworking)
iOS AFNetworking 源码阅读三
接下来我们来补充之前AFURLResponseSerialization这一块是如何解析数据的
赵哥窟
2018/12/17
1K0
IOS开发系列——NSUrlSession专题
http://blog.csdn.net/qq_29846663/article/details/68961167
江中散人_Jun
2023/10/11
7410
IOS开发系列——NSUrlSession专题
AFNetworking框架分析(二)——AFURLSessionManager(上)
AFURLSessionManager 这个类是AFN框架的核心类,基本上通过它来实现了大部分核心功能。负责请求的建立、管理、销毁、安全、请求重定向、请求重启等各种功能。他主要实现了NSURLSession和NSRULSessionTask的封装。 首先来对比下系统URLSession网络请求与AFN网络请求的方法
我只不过是出来写写代码
2019/04/02
2K0
AFNetworking框架分析(二)——AFURLSessionManager(上)
iOS-网络编程(三)AFNetworking使用
一. AFNetworking简单介绍 通过前面学习的HTTP协议的基本知识,GET/POST请求的区别,NSURLConnection 和 NSURLSession的使用,已经基本了解了网络请求的方
xx_Cc
2018/05/10
2.3K0
【IOS开发基础系列】数据编解码专题
NSData* originData = [originStr dataUsingEncoding: NSASCIIStringEncoding];
江中散人_Jun
2022/03/08
8420
[iOS开发]JSONModel源码学习
首先,在这个模型类的对象被初始化的时候,遍历自身到所有的父类(直到JSONModel为止),获取所有的属性,并将其保存在一个字典里。获取传入字典的所有key,将这些key与保存的所有属性进行匹配。如果匹配成功,则进行kvc赋值。
Billy Miracle
2022/05/08
1.5K0
相关推荐
iOS - - JSON 和 XML解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档