Objective-C学习之解析XML
通过soap请求webservice时,返回的数据是XML类型,有时候也需要解析本地的xml数据等,苹果自带类NSXMLParser解析xml还是很方便的,简单轻便
本文以解析本地XML为例,网络获取到的返回值只需转换成NSData型,解析是同理
需要解析的xml文件如下,users.xml
01
<?xml version="1.0" encoding="UTF-8"?>
02
<AllUsers>
03
<message>用户信息</message>
04
<user>
05
<name>芳仔小脚印</name>
06
<age>10</age>
07
<school>JiangSu University</school>
08
</user>
09
<user>
10
<name>毒虫</name>
11
<age>22</age>
12
<school>NanJing University</school>
13
</user>
14
<user>
15
<name>女神</name>
16
<age>23</age>
17
<school>HongKong University</school>
18
</user>
19
</AllUsers>
我们用一个数组来存放,最终数据结构为
01
(
02
{
03
message = "用户信息";
04
},
05
{
06
age = 10;
07
name = "芳仔小脚印";
08
school = "JiangSu University";
09
},
10
{
11
age = 22;
12
name = "毒虫";
13
school = "NanJing University";
14
},
15
{
16
age = 23;
17
name = "女神";
18
school = "HongKong University";
19
}
20
)
解析步骤
一、声明代理 NSXMLParserDelegate
二、解析
01
// 遇到节点message和user时作为一个字典存放
02
NSArray *keyElements = [[NSArray alloc] initWithObjects:@"message",@"user", nil];
03
// 需要解析的字段
04
NSArray *rootElements = [[NSArray alloc] initWithObjects:@"message",@"name",@"age",@"school", nil];
05
// 获取xml文件的路径
06
NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"users" ofType:@"xml"];
07
// 转化为Data
08
NSData *data = [[NSData alloc] initWithContentsOfFile:xmlPath];
09
10
// 初始化
11
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
12
13
// 代理
14
xmlParser.delegate = self;
15
// 开始解析
16
BOOL flag = [xmlParser parse];
17
if (flag) {
18
NSLog(@"解析成功");
19
}
20
else{
21
NSLog(@"解析出错");
22
}
中间变量,在.m的interface的中定义
1
NSString *currentElement;
2
3
NSString *currentValue;
4
5
NSMutableDictionary *rootDic;
6
7
NSMutableArray *finalArray;
代理方法
01
#pragma - mark 开始解析时
02
-(void)parserDidStartDocument:(NSXMLParser *)parser
03
{
04
// 用数组存储每一组信息
05
finalArray = [[NSMutableArray alloc] init];
06
07
08
}
09
#pragma - mark 发现节点时
10
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
11
{
12
for(NSString *key in self.keyElements){
13
if ([elementName isEqualToString:key]) {
14
// 关键节点开始时,初始化一个字典来存放值
15
rootDic = nil;
16
17
rootDic = [[NSMutableDictionary alloc] initWithCapacity:0];
18
19
}
20
else {
21
for(NSString *element in self.rootElements){
22
if ([element isEqualToString:element]) {
23
currentElement = elementName;
24
currentValue = [NSString string];
25
}
26
}
27
}
28
}
29
30
}
31
#pragma - mark 发现节点值时
32
33
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
34
{
35
36
if (currentElement) {
37
38
currentValue = string;
39
[rootDic setObject:string forKey:currentElement];
40
}
41
42
}
43
#pragma - mark 结束节点时
44
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
45 javascript特效
{
46
if (currentElement) {
47
[rootDic setObject:currentValue forKey:currentElement];
48
currentElement = nil;
49
currentValue = nil;
50
}
51
for(NSString *key in self.keyElements){
52
53
if ([elementName isEqualToString:key]) {
54
// 关键节点结束时,将字典存放在数组中
55
if (rootDic) {
56
57
[finalArray addObject:rootDic];
58
}
59
}
60
}
61
}
62
#pragma - mark 结束解析
63 http://www.huiyi8.com/jiaoben/
-(void)parserDidEndDocument:(NSXMLParser *)parser
64
{
65
66
}
解析完成后,打印出finalArray为
view sourceprint?
01
{
02
message = "\U7528\U6237\U4fe1\U606f";
03
},
04
{
05
age = 10;
06
name = "\U82b3\U4ed4\U5c0f\U811a\U5370";
07
school = "JiangSu University";
08
},
09
{
10
age = 22;
11
name = "\U6bd2\U866b";
12
school = "NanJing University";
13
},
14
{
15
age = 23;
16
name = "\U5973\U795e";
17
school = "HongKong University";
18
}
19
)
Objective-C学习之解析XML的更多相关文章
- 【javaweb学习】解析XML
XML解析方式有两种 dom:Document Object Model文档对象模型,是w3c组织推荐的解析方式 sax:Simple Api XML不是官方标准,但它是XML社区实际上的标准,几乎所 ...
- 学习笔记-解析xml文件
1. Dom4J <students> <student> <name>吴飞</name> <c ...
- XML学习——java解析xml文件
递归获取每个标签 package test; import java.io.File; import java.util.List; import org.dom4j.Document; import ...
- iOS SDK中使用NSXMLParser解析XML(iphone网络篇三)
iOS SDK的NSXMLParser解析XML文档是事件驱动模式的,即采用SAX方式来解析XML格式文档.NSXMLParser在处理XML文档的过程中当遇到一些要素(元素.属性.CDATA块.评论 ...
- ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的
最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...
- 【Android学习笔记】XmlResourceParser解析xml文件
最近学习Android时,需要用到解析XML文件里的数据,可以用XmlResourceParser来解析xml文件,正好将此记录下来. XmlResourceParser里常用的字段和方法 首先先给出 ...
- [置顶] Android学习系列-Android中解析xml(7)
Android学习系列-Android中解析xml(7) 一,概述 1,一个是DOM,它是生成一个树,有了树以后你搜索.查找都可以做. 2,另一种是基于流的,就是解析器从头到尾解析一遍xml文件. ...
- Javaweb学习笔记——使用Jdom解析xml
一.前言 Jdom是什么? Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.它是直接为java编程服务,利用java语言的特性(方法重载,集合 ...
- Android开发学习---使用XmlPullParser解析xml文件
Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将 ...
随机推荐
- java retry:详解
发现 今天在探秘线程池原理知识点,在阅读JDK源码时遇到程序代码中出现如下代码,因为之前没有遇到过,于是特地记录下来并谷歌了一番,后面我自己做了一些简要的验证和分析. 验证 网上溜达一番发现,这ret ...
- 327. Count of Range Sum
/* * 327. Count of Range Sum * 2016-7-8 by Mingyang */ public int countRangeSum(int[] nums, int lowe ...
- Java-线程池总结
线程池的优点: 重用线程,减少线程创建和销毁的性能开销. 管理线程,并提供定时执行以及指定间隔循环执行等功能. Android中的线程来源于Java中的Executor,实现类是ThreadPoolE ...
- Windows Server 2003中报PerfDisk “无法从系统读取磁盘性能信息。
Windows Server 2003中报PerfDisk “无法从系统读取磁盘性能信息.”的问题解决 2015-01-22 09:49:02 标签:Windows Server2003 PerfDi ...
- 高通msm8994启动流程简单介绍
处理器信息 8994包括例如以下子系统: 子系统 处理器 含义 APSS 4*Cortex-A53 应用子系统 APSS 4*Cortex-A57 应用子系统 LPASS QDSP6 v5.5A(He ...
- Proftpd快速搭建FTP服务器
前言 在Linux系统中,FTP服务器软件有很多,都已经成熟,像vsftpd, wu-ftp, Pure-FTPd等.但这些软件安装配置起来都比较麻烦,搭建个人的FTP服务器,还是Proftpd比较简 ...
- 千呼万唤始出来:ArchLinux for Espressobin
前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...
- phpcms v9中 action="position" 和action="lists"有什么差别, 以及action 的属性和值
action值的含义: lists 内容数据(文章?)列表 relation 内容相关文章 hits 内容数据点击排行榜 category 内容栏目列表 position 内容推荐位列表
- 【Python】输出程序运行的百分比
对于一些大型的Python程序.我们须要在命令行输出其百分比,显得更加友好,以免被人误会程序陷入死循环.假死的窗口. 关键是利用到不换行的输出符\r,\r的输出.将直接覆盖掉此行的内容. 比方例如以下 ...
- go mysql dsn
https://github.com/go-sql-driver/mysql#dsn-data-source-name DSN (Data Source Name) The Data Source N ...