zoukankan      html  css  js  c++  java
  • 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 = "U7528U6237U4fe1U606f";
    03
        },
    04
            {
    05
            age = 10;
    06
            name = "U82b3U4ed4U5c0fU811aU5370";
    07
            school = "JiangSu University";
    08
        },
    09
            {
    10
            age = 22;
    11
            name = "U6bd2U866b";
    12
            school = "NanJing University";
    13
        },
    14
            {
    15
            age = 23;
    16
            name = "U5973U795e";
    17
            school = "HongKong University";
    18
        }
    19
    )

  • 相关阅读:
    I/O会一直占用CPU吗?【转载】
    CPU和线程的关系
    future封装了callable,thread封装future。
    (转)Java中的守护线程
    线程中sleep方法和wait方法有什么区别?(转)
    Java异常---获取异常的堆栈信息
    分析iOS Crash文件,使用命令符号化iOS Crash文件
    String Matching(poj1580)
    U转串口驱动安装
    [LNU.Machine Learning.Question.1]梯度下降方法的一些理解
  • 原文地址:https://www.cnblogs.com/xkzy/p/3811973.html
Copyright © 2011-2022 走看看