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 = [[NSMutableArray alloc] init];
self.bodyStr = [[NSMutableString alloc] init];
因为要记录每个节点的键值,currDic在解析过程中进行初始化。
4.初始化parser并开始进行解析
//解析数据
//利用需要解析的xml数据data进行初始化
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//设置代理,以便使用其回调方法进行数据解析
[parser setDelegate:self];
5.解析过程在所添加协议的回调方法中进行
//节点开始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//判断当前节点名,NSOrderedSame用以判断字符串是否相等
if (NSOrderedSame == [elementName compare:@"AirlinesTime"]) {
//初始化字典
self.currDic = [[NSMutableDictionary alloc] init];
}
}
//节点中间,节点开始标签和结束标签之间,处理内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//非空判断
if (string != nil) {
//去处特殊字符,空格和下划线之类
NSString *trim = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//将读取到的内容存入准备好的字符串中
[_bodyStr appendFormat:@"%@",trim];
}
}
//节点结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//判断节点名
if (NSOrderedSame == [elementName compare:@"Company"]) {
//存入字典
[_currDic setObject:[self.bodyStr copy] forKey:@"Company"];
}
else if (NSOrderedSame == [elementName compare:@"AirlineCode"]) {
//存入字典
[_currDic setObject:[self.bodyStr copy] forKey:@"AirlineCode"];
}
else if (NSOrderedSame == [elementName compare:@"StartDrome"]) {
//存入字典
[_currDic setObject:[self.bodyStr copy] forKey:@"StartDrome"];
}
else if (NSOrderedSame == [elementName compare:@"ArriveDrome"]) {
//存入字典
[_currDic setObject:[self.bodyStr copy] forKey:@"ArriveDrome"];
}
else if (NSOrderedSame == [elementName compare:@"Week"]) {
//存入字典
[_currDic setObject:[self.bodyStr copy] forKey:@"Week"];
}
//读取到数据结构结束节点
else if (NSOrderedSame == [elementName compare:@"AirlinesTime"]) {
//将准备好数据的字典,作为对象存放到准备好的集合中
[_listPlaneCodes addObject:_currDic];
_currDic = nil;
}
//清空存数据值的字符串,清除长度根据字符串自己的长度
[_bodyStr deleteCharactersInRange:NSMakeRange(0,[_bodyStr length])];
}
6.解析结束
//如果解析完成,则返回true
BOOL flag = [parser parse];
if (flag) {
//解析成功
}else{
//解析失败
}