IOS XML解析

来源:互联网 发布:二叉树的先序遍历算法 编辑:程序博客网 时间:2024/05/29 16:02

xml文件中需要解析的数据节点单个样式
<AirlinesTime diffgr:id="AirlinesTime1" msdata:rowOrder="0">        <Company>吉祥航空</Company>        <AirlineCode>HO1252</AirlineCode>        <StartDrome>北京首都国际机场</StartDrome>        <ArriveDrome>上海虹桥国际机场</ArriveDrome>        <StartTime>06:35</StartTime>        <ArriveTime>09:00</ArriveTime>        <Mode>320</Mode>        <AirlineStop>0</AirlineStop>        <Week>123456日</Week>      </AirlinesTime>

1. 在.h文件中加入协议

NSXMLParserDelegate


2.在.h文件中定义3个属性,用于解析过程中的存值和保存所有解析完成的数据

@property (strong,nonatomic)NSMutableString *bodyStr;//解析出来的内容暂存字符串

@property (strong,nonatomic)NSMutableDictionary *currDic;//数据键值对

@property (strong,nonatomic)NSMutableArray *listPlaneCodes;//存放解析完对象的集合


3.在.m文件中,找地方初始化上面的3个属性

viewDidLoad中:

//初始化解析用到的变量

self.listPlaneCodes = [[NSMutableArrayalloc] init];

self.bodyStr = [[NSMutableStringalloc] init];

因为要记录每个节点的键值,currDic在解析过程中进行初始化。


4.初始化parser并开始进行解析

//解析数据

//利用需要解析的xml数据data进行初始化

NSXMLParser *parser = [[NSXMLParseralloc] initWithData:data];

//设置代理,以便使用其回调方法进行数据解析

[parsersetDelegate:self];


5.解析过程在所添加协议的回调方法中进行

//节点开始

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{

    //判断当前节点名,NSOrderedSame用以判断字符串是否相等

   if (NSOrderedSame == [elementNamecompare:@"AirlinesTime"]) {

       //初始化字典

       self.currDic = [[NSMutableDictionaryalloc] init];

    }

}



//节点中间,节点开始标签和结束标签之间,处理内容

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

    //非空判断

   if (string != nil) {

        //去处特殊字符,空格和下划线之类

        NSString *trim = [stringstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];

        //将读取到的内容存入准备好的字符串中

        [_bodyStrappendFormat:@"%@",trim];

    }

}


//节点结束

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

    //判断节点名

   if (NSOrderedSame == [elementNamecompare:@"Company"]) {

       //存入字典

        [_currDicsetObject:[self.bodyStrcopy] forKey:@"Company"];

    }

    

   else if (NSOrderedSame == [elementNamecompare:@"AirlineCode"]) {

       //存入字典

        [_currDicsetObject:[self.bodyStrcopy] forKey:@"AirlineCode"];

    }

    

   else if (NSOrderedSame == [elementNamecompare:@"StartDrome"]) {

       //存入字典

        [_currDicsetObject:[self.bodyStrcopy] forKey:@"StartDrome"];

    }

    

   else if (NSOrderedSame == [elementNamecompare:@"ArriveDrome"]) {

       //存入字典

        [_currDicsetObject:[self.bodyStrcopy] forKey:@"ArriveDrome"];

    }

    

   else if (NSOrderedSame == [elementNamecompare:@"Week"]) {

       //存入字典

        [_currDicsetObject:[self.bodyStrcopy] forKey:@"Week"];

    }

    //读取到数据结构结束节点

   else if (NSOrderedSame == [elementNamecompare:@"AirlinesTime"]) {

        //将准备好数据的字典,作为对象存放到准备好的集合中

        [_listPlaneCodesaddObject:_currDic];

       _currDic = nil;

    }

    

    //清空存数据值的字符串,清除长度根据字符串自己的长度

    [_bodyStrdeleteCharactersInRange:NSMakeRange(0,[_bodyStrlength])];

}


6.解析结束

//如果解析完成,则返回true

   BOOL flag = [parser parse];

   if (flag) {

       //解析成功

    }else{

       //解析失败

        

    }