1.XML格式如下:
<Response> <ResultCode>0</ResultCode> <ResultDesc>成功</ResultDesc> <CallList> <CallRecord> <Mobile>13438939840</Mobile> <Type>0</Type> <CallTime>20180724135945</CallTime> <ContactName /> <Location>四川成都</Location> <TypeStatus>0</TypeStatus> <TypeId /> <TypeName /> <Count /> <TeleSpName>移动</TeleSpName> </CallRecord> <CallRecord> <Mobile>13438939840</Mobile> <Type>0</Type> <CallTime>20180724135941</CallTime> <ContactName /> <Location>四川成都</Location> <TypeStatus>0</TypeStatus> <TypeId /> <TypeName /> <Count /> <TeleSpName>移动</TeleSpName> </CallRecord> <CallRecord> <Mobile>18876418781</Mobile> <Type>1</Type> <CallTime>20180724111520</CallTime> <ContactName /> <Location>福建厦门</Location> <TypeStatus>0</TypeStatus> <TypeId /> <TypeName /> <Count /> <TeleSpName>移动</TeleSpName> </CallRecord> </CallList> </Response>
2.XMLUtil封装
#import <Foundation/Foundation.h> #import "XBCallTagListModel.h" //声明代理 @interface XMLUtil : NSObject<NSXMLParserDelegate> //添加属性 @property (nonatomic, strong) NSXMLParser *par; @property (nonatomic, strong) XBCallTagListModel *model; //存放每个person @property (nonatomic, strong) NSMutableArray *list; //标记当前标签,以索引找到XML文件内容 @property (nonatomic, copy) NSString *currentElement; /** 通过NSData解析XML数据,返回模型数组 */ -(NSMutableArray*)modelsArrayFromData:(NSData*)data; /** 通过NSXMLParser解析XML数据,返回模型数组 */ -(NSMutableArray*)modelsArrayFromParser:(NSXMLParser*)parser; @end
#import "XMLUtil.h" @implementation XMLUtil - (instancetype)init{ self = [super init]; if (self) { //初始化数组,存放解析后的数据 self.list = @[].mutableCopy; } return self; } /** 通过NSData解析XML数据,返回模型数组 */ -(NSMutableArray*)modelsArrayFromData:(NSData*)data { /* //获取事先准备好的XML文件 NSBundle *b = [NSBundle mainBundle]; NSString *path = [b pathForResource:@"data" ofType:@".xml"]; NSData *data = [NSData dataWithContentsOfFile:path]; */ self.par = [[NSXMLParser alloc]initWithData:data]; self.par.delegate = self; [self parse]; return self.list; } /** 通过NSXMLParser解析XML数据,返回模型数组 */ -(NSMutableArray*)modelsArrayFromParser:(NSXMLParser*)parser { self.par = parser; self.par.delegate = self; [self parse]; return self.list; } //几个代理方法的实现,是按逻辑上的顺序排列的,但实际调用过程中中间三个可能因为循环等问题乱掉顺序 //开始解析 - (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"parserDidStartDocument..."); } //准备节点 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{ self.currentElement = elementName; if ([self.currentElement isEqualToString:@"CallRecord"]){ self.model = [[XBCallTagListModel alloc]init]; } } //获取节点内容 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ if ([self.currentElement isEqualToString:@"Mobile"]) { [self.model setMobile:string]; }else if ([self.currentElement isEqualToString:@"Type"]){ [self.model setType:string]; }else if ([self.currentElement isEqualToString:@"CallTime"]){ [self.model setCallTime:string]; }else if ([self.currentElement isEqualToString:@"ContactName"]){ [self.model setContactName:string]; }else if ([self.currentElement isEqualToString:@"Location"]){ [self.model setLocation:string]; }else if ([self.currentElement isEqualToString:@"TypeStatus"]){ [self.model setTypeStatus:string]; }else if ([self.currentElement isEqualToString:@"TypeId"]){ [self.model setTypeId:string]; }else if ([self.currentElement isEqualToString:@"TypeName"]){ [self.model setTypeName:string]; }else if ([self.currentElement isEqualToString:@"Count"]){ [self.model setCount:string]; }else if ([self.currentElement isEqualToString:@"TeleSpName"]){ [self.model setTeleSpName:string]; } } //解析完一个节点 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{ if ([elementName isEqualToString:@"CallRecord"]) { [self.list addObject:self.model]; } self.currentElement = nil; } //解析结束 - (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"parserDidEndDocument...%@",self.list); } //外部调用接口 -(void)parse{ [self.par parse]; } @end
3.数据模型建立:
#import "XBBaseModel.h" @interface XBCallTagListModel : XBBaseModel @property (nonatomic, strong) NSString * Mobile ;//呼叫号码 @property (nonatomic, strong) NSString * Type ;//呼叫类型 @property (nonatomic, strong) NSString * CallTime ;//拨打时间 @property (nonatomic, strong) NSString *ContactName;//通话号码 若为空时,由手机客户端再次匹配本地联系人名称,若存在就显示 @property (nonatomic, strong) NSString *Location;//号码归属地 @property (nonatomic, strong) NSString *TypeStatus;//是否为自标记号码 0:未标记 @property (nonatomic, strong) NSString *TypeId;//标记号码类型 @property (nonatomic, strong) NSString *TypeName;//标记类型名称 @property (nonatomic, strong) NSString *Count;//备注 描述被多少人标记信息 @property (nonatomic, strong) NSString *TeleSpName;//运营商名称 - (instancetype)initWithDict:(NSDictionary*)dict; @end #import "XBCallTagListModel.h" @implementation XBCallTagListModel -(instancetype)initWithDict:(NSDictionary *)dict { self = [super init]; if (self) { [self setValuesForKeysWithDictionary:dict]; } return self ; } @end
4.使用
-(XMLUtil *)xmlUntil { if (!_xmlUntil) { _xmlUntil = [[XMLUtil alloc] init]; } return _xmlUntil; } //本地数据解析: NSBundle *b = [NSBundle mainBundle]; NSString *path = [b pathForResource:@"data" ofType:@".xml"]; NSData *data = [NSData dataWithContentsOfFile:path]; self.dataArr = [self.xmlUntil modelsArrayFromData:data]; [self.tableView reloadData]; //网络数据解析 NSString * url = @"https://127.0.0.1:8080/GetCallList"; //设置请求头 NSString *apiName = @"GetCallList"; NSString *sessionId = MyUUID; NSString *timeStamp = [XBTool getMiGuTimeStamp]; NSString *accessCode = @"161107016888";//161107015550 NSString *channel = @"3"; NSString *accessCodeKey = @"3A4B04_6C7@F1D01";//秘钥 NSString * mdn = @"15959285442";//18367151969 NSString *md5PhoneNum = [mdn hd_base64Encode];//Mid手机号码,base64编码 NSString * signature = [NSString stringWithFormat:@"%@%@%@%@%@%@%@",apiName,sessionId,timeStamp,channel,accessCode,accessCodeKey,md5PhoneNum];//@"Signature" NSString * md5String = [signature hd_md5UpperString]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.requestSerializer.timeoutInterval = 5; manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/xml", @"text/xml", nil]; // 2.设置非校验证书模式 manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; manager.securityPolicy.allowInvalidCertificates = YES; [manager.securityPolicy setValidatesDomainName:NO]; [manager.requestSerializer setValue:@"text/plain;charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [manager.requestSerializer setValue:@"1.0" forHTTPHeaderField:@"Version"]; [manager.requestSerializer setValue:sessionId forHTTPHeaderField:@"SessionId"]; [manager.requestSerializer setValue:timeStamp forHTTPHeaderField:@"TimeStamp"]; [manager.requestSerializer setValue:md5String forHTTPHeaderField:@"Signature"]; [manager.requestSerializer setValue:channel forHTTPHeaderField:@"Channel"]; [manager.requestSerializer setValue:accessCode forHTTPHeaderField:@"AccessCode"]; [manager.requestSerializer setValue:@"1" forHTTPHeaderField:@"NetStandard"]; [manager.requestSerializer setValue:@"1" forHTTPHeaderField:@"NetAccessType"]; [manager.requestSerializer setValue:md5PhoneNum forHTTPHeaderField:@"Mid"]; [manager POST:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"好的"); self.dataArr = [self.xmlUntil modelsArrayFromParser:(NSXMLParser*)responseObject]; [self.tableView reloadData]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { }];