iOS开发------XML原生解析(NSXMLParser篇)

iOS基础:NSXMLParser (SAX方式解析) 使用步骤// 传入XML数据,创建解析器 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 设置代理,监听解析过程 parser.delegate = self; // 开始解析 [parser parse];NSXMLParser采取的是SAX方式解析,特点是事件驱动,下面情况都会通知代理当扫描到文档(Documen 阅读详情

由于项目需要,最近就研究了一些与视频流相关的知识,在学习的过程中发现,JSON作为轻量级的数据传输格式就显的非常不便.当然,这句话的意思就是说在学习过程中碰到的XML格式数据居多了呗,这时掌握一些XML的解析方法就显得重要了。

尽管之前转发过一篇介绍XML解析的博文网络数据的XML解析,但总觉得千转不如一写,所以就花时间研究了一下。

很多第三方代码其实能够很好的帮助我们解析数据,但由于楼主的个性,在认可第三方代码的同时,还是要掌握一下它的原理的(当然这个原理,只是比较肤浅的原理了),这一篇就记录一下iOS解析XML的原生类NSXMLParser.

本人用的是Mac自带的本地服务器,将php文件放置服务器文件夹即可,XML.php文件内容如下:

<?php

//声明一个XML文本,并声明版本和编码
$xmlParse = new DOMDocument('1.0','utf-8');
$xmlParse->formatOutput = true;

//创建头结点
$rootElement = $xmlParse->createElement("Persons");
$xmlParse->appendChild($rootElement);


//添加测试数据-添加三组数据
for ($i=0; $i < 3; $i++) 
{ 
    $element = $xmlParse->createElement("Person");

    //姓名
    $name = $xmlParse->createElement("name");
    $name->appendChild($xmlParse->createTextNode("RITL".$i));//生成结点内容
    $element->appendChild($name);

    //年龄
    $age = $xmlParse->createElement("age");
    $age->appendChild($xmlParse->createTextNode($i * 3));
    $element->appendChild($age);

    //添加该结点
    $rootElement->appendChild($element);
}

//返回
echo $xmlParse->saveXML();

?>


为了比较直观,全部用的iOS原生框架(当然,也没有使用第三方的必要0.0)
下面是用到的所有延展属性:

@import Foundation;

@interface ViewController ()<NSXMLParserDelegate>

/// @brief 存储xml对象的字典
@property (nonatomic, strong)NSMutableArray * persons;

/// @brief 记录当前编辑的xml结点对象
@property (nonatomic, strong)NSMutableDictionary * currentDictionary;

/// @brief 记录当前编辑的xml结点对象的key值
@property (nonatomic, copy)NSString * currentDictionaryKey;

@end


在ViewDidLoad中进行网络请求以及使用方法解析收到的XML信息:

- (void)viewDidLoad {
    [super viewDidLoad];

    //拼接字符串路径
    NSURL * requestURL = [NSURL URLWithString:@"http://localhost/XML.php"];

    //网络请求对象
    NSURLSession * session = [NSURLSession sharedSession];

    //避免强引用,属性值需要变化,用__block修饰
    __block __weak typeof(self) copy_self = self;

    //初始化请求任务
    NSURLSessionDataTask * dataTask = [session dataTaskWithURL:requestURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        //获得请求返回的xml字符串
        NSString * dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

        NSLog(@"xml = %@",dataString);

        //进行解析
        [copy_self decodeXML:dataString];

        //打印出结果:
        NSLog(@"result = %@",copy_self.persons);

    }];

    //开始请求
    [dataTask resume];
}


这里打印的xml格式为:

2016-06-02 15:32:03.773 YXMLParse[1069:27997] xml = <?xml version="1.0" encoding="utf-8"?>
<Persons>
  <Person>
    <name>RITL0</name>
    <age>0</age>
  </Person>
  <Person>
    <name>RITL1</name>
    <age>3</age>
  </Person>
  <Person>
    <name>RITL2</name>
    <age>6</age>
  </Person>
</Persons>


本博文的干货开始,首先是解析XML字符串的解析方法:decodeXML::

/**
 *  解析XML字符串
 *
 *  @param xmlString 解析的XML字符串
 *
 *  @return 是否解析成功,true表示成功,false表示失败
 */
- (BOOL)decodeXML:(NSString *)xmlString
{
    //初始化NSXMLParse对象
    NSXMLParser * xmlParse = [[NSXMLParser alloc]initWithData:[xmlString dataUsingEncoding:NSUTF8StringEncoding]];

    //设置代理
    xmlParse.delegate = self;

    //开始解析
    return [xmlParse parse];
}


通过协议方法不断的进行解析,同时我也按照自己的理解,尽可能的进行了注释:

#pragma mark - *************** <NSXMLParserDelegate>

/**
 *  开始解析进行回调的Delegate Function
 *
 *  @param parser 执行回调方法的NSXMLParser方法
 */
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    //初始化存放xml数据字典的数组
    self.persons = [NSMutableArray arrayWithCapacity:0];
}
/**
 *  准备解析结点进行的回调
 *  在此处可以获取每个xml结点所传递的信息,如(xmlns--类似命名空间)
 *
 *  @param parser        执行回调方法的NSXMLParser对象
 *  @param elementName   结点的字符串描述(如name..)
 *  @param namespaceURI  命名空间的统一资源标志符字符串描述
 *  @param qName         命名空间的字符串描述
 *  @param attributeDict 参数字典
 */
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(nullable NSString *)namespaceURI
 qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict
{
    //表示开始遍历子结点了
    if ([elementName isEqualToString:@"Person"])//对Person标签进行比对
    {
        //新建一个索引为elementName的key字典
        NSMutableDictionary * elementNameDictionary = [NSMutableDictionary dictionary];

        //将数据添加到当前数组
        [self.persons addObject:elementNameDictionary];

        //记录当前进行操作的结点字典
        self.currentDictionary = elementNameDictionary;
    }

    //表示不是Persons的子节点,因为是else if,也保证
    else if (![elementName isEqualToString:@"Persons"])//排除Person以及Persons标签
    {
        //记录当前的结点值
        self.currentDictionaryKey = elementName;

        //设置当前element的值,先附初始值
        [self.currentDictionary addEntriesFromDictionary:@{elementName:@""}];
    }
}
/**
 *  获得首尾结点间内容信息的内容
 *
 *  @param parser 执行回调方法的NSXMLParse对象
 *  @param string 结点间的内容
 *  如果结点之间的内容是结点段,那么返回的string首字符为unichar类型的‘\n’
 *  如果不是结点段,那么直接返回之间的信息内容
 */
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    //如果结点内容的第一个字符是‘\n’,表示是包含其他结点的结点
    if (string.length > 0 && [string characterAtIndex:0] != '\n')
    {
        //对当前字典进行初始化赋值
        [self.currentDictionary setValue:string forKey:self.currentDictionaryKey];
    }   
}
/**
 *  某个结点解析完毕进行的回调
 *
 *  @param parser       执行回调方法的NSXMLParse对象
 *  @param elementName  结点的字符串描述(如name..)
 *  @param namespaceURI 命名空间的统一资源标志符字符串描述
 *  @param qName        命名空间的字符串描述
 */
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    //只有结束Person的时候清除相关数据
    if ([elementName isEqualToString:@"Person"])
    {
        //cleat data
        self.currentDictionary = nil;
        self.currentDictionaryKey = nil;
    }
}
/**
 *  XML解析完成进行的回调
 *
 *  @param parser 执行回调方法的NSXMLParse对象
 */
- (void)parserDidEndDocument:(NSXMLParser *)parser
{

}

最后输出一下解析完毕之后添加到数组中的数据,打印如下:

2016-06-02 15:32:03.774 YXMLParse[1069:27997] result = (
        {
        age = 0;
        name = RITL0;
    },
        {
        age = 3;
        name = RITL1;
    },
        {
        age = 6;
        name = RITL2;
    }
)//完成解析
ios xml解析 NSXMLParser ios xml解析 NSXMLParser。 NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。 立即下载

相关推荐

hcaptcha逆向实战:从API解析到参数构造的完整链路

本文详细拆解了hcaptcha验证码的逆向实战流程,从环境准备、捕获API与版本号,到解析核心加密逻辑hsw.js,再到构造getcaptcha请求参数,最后完成验证提交。文章重点剖析了motionData、n、c等关键参数的获取与构造方法,为开发者模拟浏览器行为、实现自动化验证提供了清晰的完整链路指南。

ik678901的博客 629

ios15使用NSXMLParser解析XML

ios15解析XML 今天我们使用NSXMLParser这个类解析XML。 解析的类必须遵守NSXMLParserDelegate代理。 - (void)viewDidLoad { [super viewDidLoad]; NSString *path = [[NSBundle mainBundle] pathForResource:@"111.xml" ofType:nil]; NSData *data = [NSData dataWithContentsOfFile:path];

A1521315qwss的博客 1605

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

weixin_37584728的博客 4740

iOS 详解NSXMLParser方法解析XML数据方法

前一篇文章已经介绍了如何通过URL从网络上获取xml数据。下面介绍如何将获取到的数据进行解析。 下面先看看xml的数据格式吧! Circumference Nicholas Nicastro Eratosthenes and the Ancient Copernicus Secret Jack Repcheck How the scientific revolution began

小邓笔记 1万+

基于STM32的多参数水质检测仪系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6主控,搭配pH、TDS、浊度、水温四大核心水质检测模块,完整实现了多参数水质检测仪的全流程开发,从多通道ADC采集、数字滤波、温度补偿、专业校准、阈值报警到人机交互,全流程无跳步保姆式拆解,配套逐行注释可直接编译的开源代码,新手跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 484

HFSS学习笔记——Vivaldi天线仿真(一)

Vivaldi 天线HFSS仿真,HFSS中指数曲线绘制及曲面绘制。

and_future的博客 1万+

IOS开发系列——xml文件解析

IOS开发系列——xml文件解析 一、概述 由于xml具有强大的扩展性及清晰的结构,使其广泛用于各种文件配置,比如皮肤配置;那么在IOS该如何解析xml文件呢?xml解析必然要用到xml解析库,有libxml、tinyxml等,但在IOS的API中提供了NSXMLParser类,通过NSXMLParser可以实现快速访问xml中相关字段; 二、NSXMLParser类几个重要

smallmuou的专栏 6004

揭秘Synopsys EDA中的AI黑科技:DSO.ai如何改变传统芯片设计流程

本文深入探讨了Synopsys EDA中的AI黑科技DSO.ai如何革新传统芯片设计流程。通过数据驱动的方法论、功耗优化革命和时序收敛智能加速,DSO.ai显著提升了设计效率和质量,实现了从经验驱动到AI驱动的范式转变。文章还提供了实战指南,帮助团队跨越AI EDA的实施鸿沟。

weixin_29296241的博客 527

IOS 详解NSXMLParser方法解析XML数据方法

Xml数据格式 [html] view plaincopy xml version="1.0" encoding="UTF-8"?>   Books>   Book id="1">   title>Circumferencetitle>   author>Nicholas Nicastroauthor>   summary>Eratos

xjntosc的专栏 591

Field Characteristics 深入解析,理解 SAP ABAP Analytics 中 Dimension 与 Measure 的真正边界

在SAP ABAP Analytics数据模型中,字段应建模为Dimension还是Measure,关键在于业务语义而非数据类型。Dimension提供分析上下文,构成数据坐标系,支持钻取与切片;Measure则需具备明确聚合语义(如#SUM、#MIN、#MAX),且必须满足Distinct(无重复)与Complete(无缺失)原则,确保聚合结果准确。错误的建模会导致聚合偏差,根源常在事实粒度不清或关联关系不当。因此,正确划分字段角色,本质是让Analytical Engine准确理解业务数据的分析逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 58

PCL点云八叉树体素中心下采样,体素包含点索引提取

基于PCL octree实现点云八叉树计算,支持提取体素中心点进行点云下采样;根据任一点坐标,可以得到其在八叉树中的位置,输出对应体素内其余点的坐标或者索引

qq_48694523的博客 462

iOS数据解析之NSXMLParser

(void)viewDidLoad { [super viewDidLoad];[self setUpDataXMLParser]; }// NSXMLParser 分析XML文件 - (void)setUpDataXMLParser { // 创建路径 NSString *path = [[NSBundle mainBundle] pathForResource:@”St

丫丫 632

融合Retinex理论与Transformer的YOLOv8低光照目标检测增强方法【YOLOv8】

图像分解:将输入图像分解为光照成分和反射成分。光照估计:估计光照图以消除暗光区域。图像重建:将光照增强后的反射图像重建成最终图像。Retinexformer通过在Transformer中引入Retinex的图像增强思路,使得低光照图像的细节能够得到充分保留。本文提出了一种基于Retinexformer的低光照增强方法,用于改进YOLOv8模型在夜间和低光照环境下的目标检测性能。

博客 1929

iOS网络数据解析--XML解析详解(GDataXMLNode&原生NSXMLParser)

在iOS开发中,大多数情况下,从网络获取的数据通常分两种。 JSON格式或者XML格式。 JSON是一种轻量级的数据格式,一般用于数据交互 JSON数据类似OC中的字典,解析方式也有很多ios5中apple增加了解析JSON的api:NSJSONSerialization (性能最好)下面是NSJSONSerialization常用的两个方法// JSON数据  OC对象 + (id)JSO

一个不安分的Coder 2654

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

iOS网络编程开发—JSON解析与XML解析

一、什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)   JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的注意点:key必须用双引号   要想从JS

Jason 的博客 4976

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

iOS-XML文件解析(原生NSXMLParser和GDataXML两种解析方式)

XML文件解析常用的两种方式一种为苹果原生的NSXMLParser,另外一种为第三方GDataXML 1.原生的NSXMLParser方式: //*利用 NSXMLParser 方式 -(void)XMLParserWithData:(NSData *)data{ //1.创建NSXMLParser NSXMLParser *XMLParser = [[NSXMLParse

H.A.N的博客 296

RaptureXML与其他XML库对比:为什么它是iOS开发的最佳选择

在iOS和Mac开发中,选择合适的XML解析库对项目效率至关重要。**RaptureXML**作为一款简单、实用的基于块的XML API,为开发者提供了高效处理XML数据的解决方案。本文将深入对比RaptureXML与其他主流XML库,解析它为何能成为iOS开发的理想选择。 ## 📌 RaptureXML核心优势解析 ### 1. 简洁直观的块式API设计 RaptureXML采用创新的块式

gitblog_00246的博客 299

iOS开发网络篇—XML数据的解析

iOS开发网络篇—XML介绍 一、XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document)   XML举例             二、XML的语法 1.简单

FLY的专栏 1692

用苹果原生自带的NSURLParser解析XML数据:

今天先来无事,就整理并总结了一下关于XML数据解析,依赖方便自己查阅,二来,对于需要这方法知识给养的同仁提供参考,希望自己所做的这些能够帮到大家: 用苹果原生自带的NSURLParser解析XML数据: 1.    先创建一个跟NSData二进制数据相关联的NSXMLParser解析器,并设置解析器的代理为当前控制器,调用parse方法开启解析器  // 发送异步请求     [N

VAN_MR的博客 820

Hpple性能对比分析:iOS开发者必看的XML/HTML解析库基准测试终极指南

Hpple作为一款受Hpricot启发的Objective-C XML/HTML解析库,凭借其简洁的API设计和强大的XPath查询能力,成为iOS开发中处理标记语言数据的热门选择。本文将通过客观的基准测试数据,全面对比Hpple与其他主流iOS解析库的性能表现,帮助开发者在项目中做出最优技术选型。 ## 为什么选择Hpple?核心优势解析 Hpple的核心价值在于将复杂的libxml2解析功

gitblog_00227的博客 1063

ios之JSON、XML解析

现大多公司使用接口数据都是json格式,但也有少量很来的系统还是使用XML格式来传递数据。简单聊聊,json、及xml的解析 JSON 什么是json? 首先来说说什么是json。 json是一种轻量级的数据格式,一般用于数据交互;服务器方会给客户端的数据,一般都是json格式或者xml(文件下载除外) JSON的格式很像OC中的数组和字典,如下 {"name":"张三","age":22}、[{"name":"张三","age":22},{"name":"李四","age":22}] 标准的JSON格式

fengyuyxz的博客 608

iOS 开发 网络编程与通信之XML解析

XML文件解析方式 SAX方式解析XML 苹果官方提供的原生的解析XML文件的方式 在iOS上解析XML文件的方式. 速度快,内存占用小. 是只读的,只能读取XML文件数据不能做修改操作. DOM方式解析XML 是在MAC使用的解析方式. 注意 : 内存消耗极大,不适用于手机. 可以读写XML文件. iPhone无法直接使用DOM方式解析XML. 如果要在iPhone上使用DOM方

高级软件开发工程师--周玉的博客 559

XML解析

非常详细的XML解析,转自:http://www.cnblogs.com/wendingding/p/3815497.html iOS开发网络篇—XML介绍 一、XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document)

她。 763

iOS开发网络篇—XML介绍

一、XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document)   XML举例             二、XML的语法 1.简单说明 一个常见的XML文档一般由以下部分组成 文档声明 元素(Element)

Default is Zero. 1887

iOS下的XML解析

XML解析 一,属性和元素的区别 二,XML的解析方式有两种     SAS:适合大,小文件解析,从上往下,一点,一点读取。苹果推荐     DOMS: 适合小文件解析,一次性将文档以属性结构读入内存。对内存消耗比较大     解析步骤:     1,打开文档     2,开始节点     3,发现节点里面的内容    

FocusOnLovingFreedom的博客 370
上一篇: iOS开发------跳转至当前Application Setting界面
下一篇: iOS开发-------基于WKWebView的原生与JavaScript数据交互
RITL
博客等级 码龄11年 69粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值