博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS - XML解析
阅读量:7237 次
发布时间:2019-06-29

本文共 4872 字,大约阅读时间需要 16 分钟。

前些日子,看到一个同学在问xml解析的问题,自己也对xml解析了解不是很多,都是用了jsno解析。别去学习了一下xml解析。

在收xml解析之前,首先先简单说一下xml的基本语法。
XML :是Extensible Markup Language的简写,全名叫做可扩展标记语言。
简单的语法如下:

这里写图片描述
这里写图片描述
这里写图片描述
示例:
需求:北京 晴 最高温度15℃ 最低温度5℃
XML实现:
复制代码

另一种实现方式:

北京晴155复制代码

以上就是简单的xml的基本语法。下面开始说iOS中xml的解析的事。

关于XML,有两种解析方式,分别是SAX(Simple API for XML,基于事件驱动的解析方式,逐行解析数据,采用协议回调机制)和DOM(Document Object Model ,文档对象模型。解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据,查找特定节点,然后对节点进行读或写)。苹果官方原生的NSXMLParse类库采用第一种方式,即SAX方式解析XML,它基于事件通知的模式,一边读取文档一边解析数据,不用等待文档全部读入以后再解析,所以如果你正打印解析的数据,而解析过程中间出现了错误,那么在错误节点之间的数据会正常打印,错误后面的数据不会被打印。解析过程由NSXMLParserDelegate协议方法回调。在这里,我们主要讲iOS原生的解析方式,就是使用NSXMLParserDelegate协议方法回调。
首先使用这个了解这个协议的代理方法:

//准备解析-(void)parserDidStartDocument:(NSXMLParser *)parser;//准备解析当前节点-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;//获取首尾节点间内容-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;//解析完当前节点-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;//解析结束-(void)parserDidEndDocument:(NSXMLParser *)parser;复制代码

简单介绍完代理后,进行写demo。

解析第一个xml的:James
撸代码:

- (IBAction)onParse:(id)sender {    NSString *xmlStr1 = @"James";    NSData *xmlData = [xmlStr1 dataUsingEncoding:NSUTF8StringEncoding];    //初始化NSXMLParser,并遵循协议    NSXMLParser *xmlParaser = [[NSXMLParser alloc]initWithData:xmlData];    xmlParaser.delegate = self;    //开始解析    [xmlParaser parse];}//准备解析-(void)parserDidStartDocument:(NSXMLParser *)parser{    _label.text = [_label.text stringByAppendingString:@"准备解析"];    _label.text = [_label.text stringByAppendingString:@"\n"];}//准备解析当前节点-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    _label.text = [_label.text stringByAppendingString:@"准备解析当前节点"];    _label.text = [_label.text stringByAppendingString:@"\n"];}//获取首尾节点间内容-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{    _label.text = [_label.text stringByAppendingString:string];    _label.text = [_label.text stringByAppendingString:@"\n"];}//解析完当前节点-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{    _label.text = [_label.text stringByAppendingString:@"解析完当前节点"];    _label.text = [_label.text stringByAppendingString:@"\n"];}//解析结束-(void)parserDidEndDocument:(NSXMLParser *)parser{    _label.text = _label.text = [_label.text stringByAppendingString:@"解析结束"];    _label.text = [_label.text stringByAppendingString:@"\n"];}@end复制代码

运行结果:

这里写图片描述

第二个例子:解析:

直接撸代码:

- (IBAction)onParse:(id)sender {//    NSString *xmlStr1 = @"James";    NSString *xmlStr2 = @"";    NSData *xmlData = [xmlStr2 dataUsingEncoding:NSUTF8StringEncoding];    NSXMLParser *xmlParaser = [[NSXMLParser alloc]initWithData:xmlData];    xmlParaser.delegate = self;    [xmlParaser parse];}//准备解析-(void)parserDidStartDocument:(NSXMLParser *)parser{    _label.text = [_label.text stringByAppendingString:@"准备解析"];    _label.text = [_label.text stringByAppendingString:@"\n"];}//准备解析当前节点-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    _label.text = [_label.text stringByAppendingString:@"准备解析当前节点"];    _label.text = [_label.text stringByAppendingString:elementName];    _label.text = [_label.text stringByAppendingString:@"\n"];    _label.text = [_label.text stringByAppendingString:[attributeDict objectForKey:@"name"]];    _label.text = [_label.text stringByAppendingString:@"\n"];}//获取首尾节点间内容-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{    _label.text = [_label.text stringByAppendingString:@"获取首尾节点间内容"];    _label.text = [_label.text stringByAppendingString:@"\n"];}//解析完当前节点-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{    _label.text = [_label.text stringByAppendingString:@"解析完当前节点"];    _label.text = [_label.text stringByAppendingString:@"\n"];}//解析结束-(void)parserDidEndDocument:(NSXMLParser *)parser{    _label.text = _label.text = [_label.text stringByAppendingString:@"解析结束"];    _label.text = [_label.text stringByAppendingString:@"\n"];}@end复制代码

运行结果:

这里写图片描述

另一种的解析,可以使用GDataXML第三方进行解析。这里不再详细说。

最后总结:

xml两种解析SAX和DOM,各有优势,比如在应对比较大数据量的XML文件时,后者由于需要先读取整个文档,性能和速度上就必然不及前者了。解析小数据量的时候使用DMO更加高效,大家可以根据数据量的多少进行合理选择。

以上就是xml的简单解析。再次感谢慕课网(

以上如有错误,请指出,非常感谢。

微信公众号:不靠谱程序猿 微信公众号:Sheffi_Programmer

Github:Sheffi(
新浪微博:Sheffi567
掘金:Sheffi(
博客地址:

转载于:https://juejin.im/post/581f2236da2f60005d021c36

你可能感兴趣的文章
Java基础——接口&简单工厂
查看>>
一位面试官给IT求职者的意见
查看>>
新手程序员需要知道的一些事
查看>>
第十章 Scala 容器基础(十四):使用map把一个集合转化为另一个
查看>>
学习规划
查看>>
Python调用SqlPlus查询Oracle
查看>>
word中插入不带标号的脚注
查看>>
nodejs配置
查看>>
秋色园QBlog技术原理解析:系列终结篇:最后的AOP策略(十九)
查看>>
TI 官方例程中对3轴加速计获得数据的处理:低通过滤、防抖算法等
查看>>
hadoop使用中遇到的问题
查看>>
VMWare虚拟机安装Windows Server 2008系统(32位)U盘引导
查看>>
Java编程笔试面试题
查看>>
行为树 ai
查看>>
三张图讲清楚Java中的方法的参数传递机制
查看>>
windows下 composer常见问题及处理
查看>>
Mysql 导入导出
查看>>
数人云|一文读懂企业如何落地微服务,循序渐进5步走
查看>>
The use of "filters='none'" is no longer supported
查看>>
各个商城调研
查看>>