XML/JSON的几种解析方式

SAX方式解析XML数据

SAX:Simple API for XML。基于事件驱动的解析方式,逐行解析数据。(采用协议回调机制)

NSXMLParser是iOS自带的XML解析类。采用SAX方式解析数据

解析过程:开始标签->取值->结束标签->取值

 

使用方式:

前提加入协议:<NSXMLParserDelegate>

具体使用如下:

    // SAX方式解析XML数据

    // 1.获得xml数据
    NSString *path = [[NSBundle mainBundle] pathForResource:@"student" ofType:@"xml"];
    // 2.将路径下的文件转化为NSData
    NSData *data = [NSData dataWithContentsOfFile:path];
    // 3.系统使用NSXMLPaser解析XML数据
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    // 4.设置代理
    parser.delegate = self;
    // 5.开始解析
    [parser parse];

#pragma mark - xml解析的协议方法
// 发现标题头
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//    NSLog(@"标题头%@", elementName);
    // 当节点头是student的时候 创建一个学生对象

    if ([elementName isEqualToString:@"student"] == 1) {
        Student *stu = [[Student alloc] init];
        [self.array addObject:stu];
        [stu release];
    }
    NSLog(@"%@", attributeDict);
}

// 发现内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//    NSLog(@"%@", string);
    self.valuesStr = string;
}

// 发现节点尾
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    Student *stu = [self.array lastObject];
    if ([elementName isEqualToString:@"number"] == 1) {
        stu.number = [self.valuesStr integerValue];
    }
    if ([elementName isEqualToString:@"name"] == 1) {
        stu.name = self.valuesStr;
    }
    if ([elementName isEqualToString:@"sex"] == 1) {
        stu.sex = self.valuesStr;
    }
    if ([elementName isEqualToString:@"phone"] == 1) {
        stu.phone = [self.valuesStr integerValue];
    }
}

DOM方式解析XML数据

DOM:Document Object Model(文档对象模型)。解析时需要将XML文件整体读入,并且将XML结构化成树状,使用再通过树状结构读取相关数据。

GDataXMLNode是Google提供的开源XML解析类,对 libxml2.dylib进⾏行了Objective-C的封装

采用DOM方式解析数据

iOS中包含一个Cyuyan的动态链接库 libxml2.dylib,解析速度比NSXMLParser快


使用方式:

将GDataXMLNode.h GDataXMLNode.m 导入文件

在Header Search Paths 中添加 /usr/include/libxml2


在Other Linker Flags 中添加 -lxml2

OK,完成导入文件

具体使用如下:

    NSString *path = [[NSBundle mainBundle] pathForResource:@"student" ofType:@"xml"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    // GDataXMLNode类的使用
    // 1.获取xml文件的 文件结构
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    
    // 2.获取xml文件的根节点(rootElement)
    GDataXMLElement *rootElement = [document rootElement];
    
    // 3.获取 子节点(根据节点的名字)
    NSArray *elements = [rootElement elementsForName:@"student"];
    
    // 4.循环 遍历 所有子结点, 进一步获取数据
    for (GDataXMLElement *element in elements) {
        NSArray *nameElements = [element elementsForName:@"name"];
        GDataXMLElement *nameNode = [nameElements firstObject];
        NSString *name = [nameNode stringValue];
        
        GDataXMLElement *numberElements = [[element elementsForName:@"number"] firstObject];
        NSInteger number = [[numberElements stringValue] integerValue];
        
        GDataXMLElement *sexElements = [[element elementsForName:@"sex"] firstObject];
        NSString *sex = [sexElements stringValue];
        
        GDataXMLElement *phontElements = [[element elementsForName:@"phone"]firstObject];
        NSInteger phone = [[phontElements stringValue] integerValue];
        
        Student *stu = [[Student alloc] init];
        stu.name = name;
        stu.number = number;
        stu.sex = sex;
        stu.phone = phone;
        [_array addObject:stu];
        [stu release];
    }
    NSLog(@"%@", _array);

使用Foundation进行JSON解析

    // 1.获得文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"studentJSON" ofType:@"txt"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    // 2.解析
    id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@", object);

使用JSONKit进行JSON解析

JSONKit是Object-C一个处理json数据的库,非常高效而且易用。

使用方法:

将包JSONKit导入到工程中
具体使用如下:
    NSString *path = [[NSBundle mainBundle] pathForResource:@"studentJSON" ofType:@"txt"];
    NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSArray *arrlist = [str objectFromJSONString];
    NSLog(@"%d", [arrlist count]);
    for (int i = 0; i < [arrlist count]; i ++) {
        NSDictionary *dic = [arrlist objectAtIndex:i];
        NSString *name = [dic objectForKey:@"name"];
        NSLog(@"%@", name);
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值