XML、JSON数据解析

本文深入探讨了XML解析技术,详细介绍了SAX和DOM两种解析方式的区别与应用,包括如何使用SAX进行逐行解析及NSXMLParserDelegate的实现,以及如何通过DOM获取文件的根节点并遍历所有子节点。同时,文章还简要提到了JSON解析方法和第三方解析包JSONkit、SBJOSN的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解析:



XML解析
XML:可扩展性标记语言   主流数据格式之一


功能:数据交换 、web服务 、内容管理 、 用作配置文件(重点)



SAX 解析-->逐行解析(采用协议回调机制)
     实现协议NSXMLParserDelegate
- (void)startParse
{
   
//xml解析:逐行解析
   
   
//从文件列表中读取数据
   
//1.获得文件路径
   
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@".xml"];
   
   
//2.通过路径把文件转换成NSData类型
   
NSData *data = [NSData dataWithContentsOfFile:sourcePath];
   
   
//创建的时候需要给parser一个字符串数据(NSData)
   
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
   
   
//设定代理人
    parser.
delegate = self;
   
   
//开始对文件进行解析
    [parser
parse];
}

- (
void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
   
//当找到节点的时候,系统调用这个方法
   
NSLog(@"节点头");
   
if ([elementName isEqualToString:@"students"]) {
       
//当找到students节点的时候,初始化数组
       
self.arr = [NSMutableArray array];
    }
else if ([elementName isEqualToString:@"student"]) {
        
//当找到student节点的时候,创建一个student对象  添加到数组里
       
Student *stu = [[Student alloc] init];
        [
self.arr addObject:stu];
        [stu
release];
    }
}


- (
void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
   
//当节点找到内容的时候,调用
   
NSLog(@"节点内容");
   
   
//把内容保存起来
   
self.tempStr = string;
}


- (
void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

   
//当找到节点结尾的时候调用
   
NSLog(@"节点尾");
   
Student *stu = [self.arr lastObject];
   
   
if ([elementName isEqualToString:@"number"]) {
        stu.
number = self.tempStr;
    }
else if ([elementName isEqualToString:@"name"]){
        stu.
name = self.tempStr;
    }
else if ([elementName isEqualToString:@"sex"]){
        stu.
sex = self.tempStr;
    }
else if ([elementName isEqualToString:@"phone"]){
        stu.
phone = self.tempStr;
    }
   
}




DOM解析-->节点解析

- (void)startDOMParse
{
   
//按节点解析
   
   
//1.获取解析的文件信息
   
NSString *xmlPath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@".xml"];
   
NSData *data = [NSData dataWithContentsOfFile:xmlPath];
   
   
   
//参数1:要解析的xml  参数2:随便  参数3:错误信息
   
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
   
   
//2.获取文件的根节点
   
GDataXMLElement *rootElement = [doc rootElement];
   
   
   
//3.进一步搜索所有的子节点
   
//返回一个装满了student节点(GDataXMLElement对象)的数组
   
NSArray *stuArrray = [rootElement elementsForName:@"student"];
   
   
//4.遍历数组,把student节点的每个子节点取出来
   
for (GDataXMLElement *element in stuArrray) {
       
       
Student *stu = [[Student alloc] init];
       
       
GDataXMLElement *nameElement = [[element elementsForName:@"name"] lastObject];
       
//name节点中取值
       
NSString *value = [nameElement stringValue];
       
//给学生对象的属性赋值
        stu.
name = value;
       
       
       
GDataXMLElement *numberElement = [[element elementsForName:@"number"] lastObject];
        value = [numberElement
stringValue];
        stu.
number = value;
       
       
       
        [
self.stuDomArray addObject:stu];
        [stu
release];
    }
   
   
}

JSON解析

 //系统提供的json解析方法
   
   
NSString *jsonPath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"txt"];
   
NSData *data = [NSData dataWithContentsOfFile:jsonPath];
   
   
NSError *error = nil;
   
//参数1:文件数据  参数2:设置解析的结果  参数3:错误信息
   
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
   
NSLog(@"%@",array);
   
   
   
for (NSDictionary *dic in array) {
       
Student *stu = [[Student alloc] init];
       
        stu.
name = [dic objectForKey:@"name"];
        stu.
sex = [dic objectForKey:@"sex"];
        stu.
phone = [dic objectForKey:@"phone"];
        stu.
number = [dic objectForKey:@"number"];
       
        [
self.stuArray addObject:stu];
        [stu
release];
    }


第三方JSON解析包:JSONkit ,  SBJOSN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr__Hacker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值