ios数据解析篇

本文介绍了iOS中XML和JSON的解析。XML是一种用于描述结构化数据的语言,分为SAX和DOM两种解析方式,其中SAX基于事件流,DOM基于文档树结构。JSON则是一种轻量级的数据交换格式,其结构类似字典和数组的嵌套。文中还提及了SAX解析XML的代码示例和使用协议接收值的方式。

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

XMLJSON解析

XMl介绍:可扩展语言,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。XML分为SAX,DOM,SAX是基于事件流的解析(每行解析),DOM是基于XML文档树结构的解析(整篇解析).XML格式是<></>,类似于html代码,html是显示界面,而XML是存储数据。一个根节点可以有多个字节点,如果没有子节点,那么该节点被称为叶子节点。XML后缀是.xml。每个<>对应一个</>,如果结构错了,那么SAX可以解析出前面正确的代码,而DOM不可以。SAX可以很好的看出错误在哪,而DOM不可以。DOM的好处就是比SAX(在没错误的时候)解析的快。

JSON介绍:轻量级的数据交换格式。JSON是对.txt解析。JSON的结构是字典,数组等嵌套关系。如果值没有“”,那么该值是NSNumber类型。


代码解释

SAX解析


我们对citys.xml来解析

<cities>
		<city>
			<name data="保定"></name>
			<latitude_e6 data="38849998"></latitude_e6>
			<longitude_e6 data="115569999"></longitude_e6>
		</city>
		<city default="true">
			<name data="北京"></name>
			<latitude_e6 data="39930000"></latitude_e6>
			<longitude_e6 data="116279998"></longitude_e6>
		</city>
</cities>

首先先创建M层来获取路径开始解析
-(void)startParser{
NSString * path = [[NSBundle mainBundle] pathForResource:@"citys" ofType:@"xml"];//获取路径
NSData * data = [NSData dataWithContentsOfFile:path];//把String转化成data格式
NSXMLParser * parser = [[NSXMLParser alloc] initWithData:data];//创建一个NSXMLParser对象
parser.delegate = self;//设置代理人
[parser parse]; //开始解析
[parser release];//释放
}


开始遵循协议(开始节点)
static NSString * Kcities = @"cities";
static NSString * kcity = @"city";
static NSString * kname = @"name";
static NSString * klatitude_e6 = @"latitude_e6";
static NSString * klongitude_e6 = @"longitude_e6";
//遵循协议方法,找到开始节点时调用。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
//如果开始节点等于kcity
if ([elementName isEqualToString:kcity]) {
SaxModel * model = [[SaxModel alloc] init]; //创建一个model
[_peoples addObject:model];//把model添加到数组上
[model release];
}
if ([elementName isEqualToString:kname]) {
SaxModel *model = [_peoples lastObject];//获取同一个model
model.name = [attributeDict objectForKey:@"data"];//取出model.name
}
if ([elementName isEqualToString:klatitude_e6]) {
SaxModel *model = [_peoples lastObject];
model.latitude_e6 = [attributeDict objectForKey:@"data"];
}
if ([elementName isEqualToString:klongitude_e6]) {
SaxModel *model = [_peoples lastObject];
model.longitude_e6 = [attributeDict objectForKey:@"data"];
}
}
}



(结束节点)
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:Kcities]) {
// [self.delegate sendMessageToRoot:_peoples];//把_peoples数组传值
_block(_peoples);//用块语法传值
}
}



块(方法)传值

-(void)getArray:(myBlock)block{
_block = Block_copy(block);//用方法传值
}




在RootViewController
-(void)saxXml{
SaxXml * sax = [[SaxXml alloc] init];
// sax.delegate = self;
[sax getArray:^(NSMutableArray * arr) {//用块语法传值
[_arr addObjectsFromArray:arr];
[_tableView reloadData];
}];
[sax startParser];//开始解析
[sax release];
}



用协议接收值

-(void)sendMessageToRoot:(NSArray *)arr{
[_arr addObjectsFromArray:arr];//用函数传值
}





DOM解析
-(void)domParserAttributes{
NSString * path = [[NSBundle mainBundle] pathForResource:@"citys" ofType:@"xml"]; //获取路径
NSData * data = [NSData dataWithContentsOfFile:path];
NSError * error = Nil;
GDataXMLDocument * document = [[GDataXMLDocument alloc] initWithData:data options:GDataXMLDocumentKind error:&error];
if (error) {
NSLog(@"error == %@",error);
}
GDataXMLElement * element = [document rootElement];
GDataXMLElement * citys = [[element children] lastObject];
NSArray * cityArr = [citys children];
for (GDataXMLElement * element in cityArr) {
NSArray * descripte = [element children];
if ([[element name] isEqualToString:@"city"]) {
SaxModel * model = [[SaxModel alloc] init];
[_arr addObject:model];
[model release];
}
for (GDataXMLElement * value in descripte) {
if ([[value name] isEqualToString:@"name"]) {
GDataXMLNode * node = [value attributeForName:@"data"];
SaxModel * model = [_arr lastObject];
model.name = [node stringValue];
}
if ([[value name] isEqualToString:@"latitude_e6"]) {
GDataXMLNode * node = [value attributeForName:@"data"];
SaxModel * model = [_arr lastObject];
model.latitude_e6 = [node stringValue];
}
if ([[value name] isEqualToString:@"longitude_e6"]) {
GDataXMLNode * node = [value attributeForName:@"data"];
SaxModel * model = [_arr lastObject];
model.longitude_e6 = [node stringValue];
}
}
}
}





JSON解析

-(void)jsonParser{
NSString * path = [[NSBundle mainBundle] pathForResource:@"citys" ofType:@"txt"];
NSData * data = [NSData dataWithContentsOfFile:path];
NSError * error = Nil;
NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
if (error) {
NSLog(@"error == %@",error);
}
[_arr addObjectsFromArray:[dic objectForKey:@"cities"]];
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值