通过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的更多相关文章

  1. 【javaweb学习】解析XML

    XML解析方式有两种 dom:Document Object Model文档对象模型,是w3c组织推荐的解析方式 sax:Simple Api XML不是官方标准,但它是XML社区实际上的标准,几乎所 ...

  2. 学习笔记-解析xml文件

    1.  Dom4J <students>       <student>         <name>吴飞</name>           <c ...

  3. XML学习——java解析xml文件

    递归获取每个标签 package test; import java.io.File; import java.util.List; import org.dom4j.Document; import ...

  4. iOS SDK中使用NSXMLParser解析XML(iphone网络篇三)

    iOS SDK的NSXMLParser解析XML文档是事件驱动模式的,即采用SAX方式来解析XML格式文档.NSXMLParser在处理XML文档的过程中当遇到一些要素(元素.属性.CDATA块.评论 ...

  5. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...

  6. 【Android学习笔记】XmlResourceParser解析xml文件

    最近学习Android时,需要用到解析XML文件里的数据,可以用XmlResourceParser来解析xml文件,正好将此记录下来. XmlResourceParser里常用的字段和方法 首先先给出 ...

  7. [置顶] Android学习系列-Android中解析xml(7)

    Android学习系列-Android中解析xml(7) 一,概述 1,一个是DOM,它是生成一个树,有了树以后你搜索.查找都可以做. 2,另一种是基于流的,就是解析器从头到尾解析一遍xml文件.   ...

  8. Javaweb学习笔记——使用Jdom解析xml

    一.前言 Jdom是什么? Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.它是直接为java编程服务,利用java语言的特性(方法重载,集合 ...

  9. Android开发学习---使用XmlPullParser解析xml文件

    Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将 ...

随机推荐

  1. KVC技巧二则

    说两个与KVC相关的技巧. 1.KVC与字典 有时候我们需要取出嵌套字典中的某个键的值.例如某个嵌套字典: NSDictionary *dict = @{@"subDict":@{ ...

  2. byte 单位换算

    1G就1GB啦,平时人们说1G只是简洁来说而已. bit(位).B(字节).K(千).M(兆).G(吉咖).T(太拉) B(Byte).KB(KiloByte).MB(MegaByte).GB(Gig ...

  3. dos alias/cname address

    diego@localhost sdk/include/Poco/Net]# dig b.wpss.cn ; <<>> DiG - <<>> b.wps ...

  4. 【Sprint3冲刺之前】项目完成时间表

    Sprint2冲刺成果——项目完成时间表 项目完成时间表 经过Sprint2小组总结会议的探讨,我们决定一起约定项目alpha版本,beta版本,release版本的发布时间,发布形式及预计完成效果 ...

  5. PCIE、UART、HDA、I2C、SMBUS、SPI、eSPI、USB、PS2、CAN、SDIO等数据传输协议简介

    M.2 wife一般支持USB.SDIO.PCIE三种传输 1.摄像头 (1)MIPI CSI (2)USB mipi摄像头模组IC简单便宜(小),应为一般把ADC解码在CPU端. MIPI摄像头简介 ...

  6. Django-Rest-Framework部分源码流程分析

    class TestView(APIView): ''' 调用这个函数的时候,会自动触发authentication_classes的运行,所以会先执行上边的类 ''' authentication_ ...

  7. caffe搭建--caffe- win10 vs2015 编译(支持GPU)--注意在cmake的时候需要根据情况仔细修改配置

    --http://blog.csdn.net/longji/article/details/60964998 注意: 在cmake的时候需要根据情况仔细修改配置,比如,如果gpu的能力不足3.0的话, ...

  8. Android 开发之static引发的冤案

    前段时间在android手机系统上开发一个小东西,先介绍一下他吧: 就是当手指点击屏幕不论什么地方的时候会出现点击的特效,就是在你点击屏幕的地方会出现各种效果,比方:雪花纷飞;出现五彩的肥皂泡:鲜花盛 ...

  9. elk 日志分析系统Logstash+ElasticSearch+Kibana4

    elk 日志分析系统 Logstash+ElasticSearch+Kibana4 logstash 管理日志和事件的工具 ElasticSearch 搜索 Kibana4 功能强大的数据显示clie ...

  10. angular cannot get /

    每次遇到这问题都一脸懵逼,好像自己啥都没改咋就悲剧了 目前知道的办法是在命令行运行ng serve,它会告诉你详细错误 因为我是通过asp.net core的集成环境运行的,它没显示出详细错误