ios 数据解析(XML,JSON)

1.何为解析

解析:按照一种约定好的格式(假象), 有后台开发人员, 按照格式存数据, 由前端按照格式取数据(谨记: 这种格式是由后台开发人员决定的, 我们无权决定)
解析的本质: 按照约定好的格式取出我们想要数据的过程,所谓“解析”就是从事先规定好的格式串中提取数据
解析的前提:提前约定好格式、数据提供方按照格式提供数据、数据获取方按照格式获取数据

2. 当今比较流行的格式

1.XML格式
Extensible Markup language (可扩展标记语言),主流格式之一,可以用来存储和传输数据格式之一,可以用来存储和传输数据。
2.JSON格式
Javascript Object Notation ,轻量级的数据交换格式,采用完全独立于语言的文本格式,被称为理想的数据交换语言,易于人阅读和便携,同时也易于及其解析何程,由于JSON解析便捷、快速,并且相同数据用JSON编辑所占的内存更小,所以在iOS中我们我们使用JSON解析更加普遍。

XML解析

1.SAX解析
SAX解析:基于事件回调的解析机制, 就是使用协议以及代理. SAX解析是逐行解析, 读入数据时只读入一行, 一行一行的解析, 所以SAX解析占用内存较小, 适合于大数据解析。
主要用到的是解析器对象:NSXMLParser,利用代理方法把数据解析出来。

    //1.创获取文件路径
    NSString *pathStr = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"xml"];
    //2.创建解析器对象
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:pathStr]];
    //3.设置代理
    parser.delegate = self;
    //4.开始解析
    [parser parse];
    NSXMLParserDelegate代理方法中的处理
/**
 *  开始解析MXL文本时调用
 */
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    NSLog(@"开始解析MXL了!");
}
/**
 *  MXL文本解析完成时调用
 */
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"\nXML解析完成了\n%@",self.persons);
}
/**
 *  当解析器读到起始标签会调用
 */
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
//    NSLog(@"elementName:%@namespaceURI:%@qName:%@attributeDict:%@",elementName,namespaceURI,qName,attributeDict);
    //缓存起始标签
    self.keyName = elementName;
    if ([elementName isEqualToString:@"person"]) {
        [self.persons addObject:[NSMutableDictionary dictionaryWithCapacity:1]];
    }
}
/**
 *  当读到结束标签时调用
 */
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    self.keyName = nil;
}
/**
 *  当解析到节点时调用此方法
 */
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSMutableDictionary *dic = [self.persons lastObject];
    if ([self.keyName isEqualToString:@"name"]) {
        [dic setValue:@"name" forKey:string];
    }
    else if ([self.keyName isEqualToString:@"gender"]) {
        [dic setValue:@"gender" forKey:string];
    }
    else if ([self.keyName isEqualToString:@"age"]) {
        [dic setValue:@"age" forKey:string];
    }
    else if ([self.keyName isEqualToString:@"name"]) {
        [dic setValue:@"name" forKey:string];
    }
    else if ([self.keyName isEqualToString:@"name"]) {
        [dic setValue:@"name" forKey:string];
    }
}

2.DOM解析
DOM解析:解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据,查找特定节点,然后对节点进行读或写。他的主要优势是实现简单,读写平衡;缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。当文件内容出现错误时,在输入框内会标记出错误的位置。
GDataXMLNode是Google提供的开元XML解析类,对libxml2.dylib进行了Objective-C的封装,因此在使用GDataXML之前,你需要先导入libxml2。
iOS中包含一个C语言的动态链接库libxml2.dylib,解析速度比NSXMLParser快,在此就不赘述了。

JSON解析

JSON解析的方法很多,第三方的解析工具主要有:JSONKit、SBJson、TouchJSON(性能从左到右,越差),个人偏向于使用原生的NSJSONSerialization来做JSON的解析,因为它性能最优。
NSJSONSerialization主要用到的就下面两个方法

+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

JSON解析打码如下:

    //1.创获取文件路径
    NSString *pathStr = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"json"];
    //2.解析JSON
    id obj = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:pathStr] options:NSJSONReadingAllowFragments error:nil];
    //3.打印解析结果
    NSLog(@"\nJSON解析完成了\n%@",obj);

项目代码下载

代码下载请猛戳这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值