XML解析案例2-XML解析标签对

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) {
        
    }];

 

 

猜你喜欢

转载自www.cnblogs.com/StevenHuSir/p/XML_TagList.html
今日推荐