Objective-C学习之解析XML

2014-10-16 记:

经热心网友指正,本文存在一定的问题,先置顶提醒我自己,有空时调试改正

有问题也请大家积极帮忙指出,谢谢大家

本文以解析本地XML为例,网络获取到的返回值只需转换成NSData型,解析是同理

需要解析的xml文件如下,users.xml

<?xml version="1.0" encoding="UTF-8"?>
<AllUsers>
    <message>用户信息</message>
    <user>
        <name>芳仔小脚印</name>
        <age>10</age>
        <school>JiangSu University</school>
    </user>
    <user>
        <name>毒虫</name>
        <age>22</age>
        <school>NanJing University</school>
    </user>
    <user>
        <name>女神</name>
        <age>23</age>
        <school>HongKong University</school>
    </user>
</AllUsers>

我们用一个数组来存放,最终数据结构为

(
        {
        message = "用户信息";
    },
        {
        age = 10;
        name = "芳仔小脚印";
        school = "JiangSu University";
    },
        {
        age = 22;
        name = "毒虫";
        school = "NanJing University";
    },
        {
        age = 23;
        name = "女神";
        school = "HongKong University";
    }
)

解析步骤 

一、声明代理 NSXMLParserDelegate

二、解析

// 遇到节点message和user时作为一个字典存放
    NSArray *keyElements = [[NSArray alloc] initWithObjects:@"message",@"user", nil];
    // 需要解析的字段
    NSArray *rootElements = [[NSArray alloc] initWithObjects:@"message",@"name",@"age",@"school", nil];
    // 获取xml文件的路径
    NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"users" ofType:@"xml"];
    // 转化为Data
    NSData *data = [[NSData alloc] initWithContentsOfFile:xmlPath];
    
    // 初始化
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
    
    // 代理
    xmlParser.delegate = self;
    // 开始解析
    BOOL flag = [xmlParser parse];
    if (flag) {
        NSLog(@"解析成功");
    }
    else{
        NSLog(@"解析出错");
    }

中间变量,在.m的interface的中定义

NSString *currentElement;
    
    NSString *currentValue;
    
    NSMutableDictionary *rootDic;
    
    NSMutableArray *finalArray;

代理方法

#pragma - mark 开始解析时
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
    // 用数组存储每一组信息
    finalArray = [[NSMutableArray alloc] init];
    
    
}
#pragma - mark 发现节点时
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    for(NSString *key in self.keyElements){
        if ([elementName isEqualToString:key]) {
            // 关键节点开始时,初始化一个字典来存放值
            rootDic = nil;
            
            rootDic = [[NSMutableDictionary alloc] initWithCapacity:0];
            
        }
        else {
            for(NSString *element in self.rootElements){
                if ([element isEqualToString:element]) {
                    currentElement = elementName;
                    currentValue = [NSString string];
                }
            }
        }
    }
    
}
#pragma - mark 发现节点值时

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    
    if (currentElement) {

        currentValue = string;
        [rootDic setObject:string forKey:currentElement];
    }
    
}
#pragma - mark 结束节点时
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if (currentElement) {
        [rootDic setObject:currentValue forKey:currentElement];
        currentElement = nil;
        currentValue = nil;
    }
    for(NSString *key in self.keyElements){

        if ([elementName isEqualToString:key]) {
            // 关键节点结束时,将字典存放在数组中
            if (rootDic) {

                [finalArray addObject:rootDic];
            }
        }
    }
}
#pragma - mark 结束解析
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
    
}

解析完成后,打印出finalArray为

{
        message = "\U7528\U6237\U4fe1\U606f";
    },
        {
        age = 10;
        name = "\U82b3\U4ed4\U5c0f\U811a\U5370";
        school = "JiangSu University";
    },
        {
        age = 22;
        name = "\U6bd2\U866b";
        school = "NanJing University";
    },
        {
        age = 23;
        name = "\U5973\U795e";
        school = "HongKong University";
    }
)

转载于:https://my.oschina.net/joanfen/blog/160640

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值