博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络之XML解析-原生
阅读量:6940 次
发布时间:2019-06-27

本文共 4355 字,大约阅读时间需要 14 分钟。

Json和XML都属于字符串,用于跨平台,前面总结了下Json,下面看下XML。

XML定义这些百度比我说的清,不再啰嗦,直接代码,我喜欢把东西都放进注释。

一、首先看下要解析的XML内容

Tom
20
John
33
Eric
43
Tony
54

 二、在项目中添加Person类为其添加属性

////  Person.h//  XmlDemo////  Created by City--Online on 15/4/29.//  Copyright (c) 2015年 CYW. All rights reserved.//#import 
@interface Person : NSObject@property(nonatomic,strong)NSString *Pid;@property(nonatomic,strong)NSString *Name;@property(nonatomic,assign)int Age;@end

 三、用IOS原生框架来解析XML,注意实现代理

////  ViewController.m//  XmlDemo////  Created by City--Online on 15/4/29.//  Copyright (c) 2015年 CYW. All rights reserved.//#import "ViewController.h"#import "Person.h"@interface ViewController () 
@property (nonatomic, strong) NSMutableArray *personArray;@property (nonatomic, strong) NSMutableString *element;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // XML的解析方式有2种// DOM:一次性将整个XML文档加载进内存,比较适合解析小文件 文档驱动// SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件 事件驱动 //IOS自带的属于SAX事件驱动的解析方式// 就是一个事物模型解析,从头开始读取文档然后根据读取到的头标签,读完头标签后,理论上是读取标签值,然后读取后遇到结束标签等 NSString *path=[[NSBundle mainBundle]pathForResource:@"user" ofType:@"xml"]; NSURL *url=[[NSURL alloc]initFileURLWithPath:path]; //实例化 NSXMLParser *parser=[[NSXMLParser alloc]initWithContentsOfURL:url]; //设置代理 parser.delegate=self; //开始解析 [parser parse]; }// step1 开始解析-(void)parserDidStartDocument:(NSXMLParser *)parser{ self.personArray = [[NSMutableArray alloc] initWithCapacity:0]; self.element = [[NSMutableString alloc] init];}//step2 开始解析元素 获取头标签的信息<>里面的属性、名字-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ if ([elementName isEqualToString:@"Users"]) { NSLog(@"进入
"); } if ([elementName isEqualToString:@"User"]) { NSLog(@"进入
"); Person *user = [[Person alloc] init]; [_personArray addObject:user]; } if ([elementName isEqualToString:@"name"]) { NSLog(@"进入
"); Person *user = [_personArray objectAtIndex:[_personArray count] -1]; user.Pid = [attributeDict objectForKey:@"id"]; } if ([elementName isEqualToString:@"age"]) { NSLog(@"进入
"); } }//step3 获得首尾标签间 > < 的内容//此处分几种情况://1.当标签间内容为“”,如果(如图
)则进入step4,否则进入step2//2.当标签间内容不为“”,则进入step4- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ NSLog(@"%@", string); //获取文本节点中的数据,因为下面的方法要保存这里获取的数据,所以要定义一个全局变量(可修改的字符串) //这里要赋值为空,目的是为了清空上一次的赋值 [_element setString:@""]; [_element appendString:string];//string是获取到的文本节点的值,只要是文本节点都会获取(包括换行),然后到下个方法中进行判断区分}//step4 标签解析结束- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {// NSLog(@"%@", elementName); NSString *str=[[NSString alloc] initWithString:_element]; if ([elementName isEqualToString:@"Users"]) { NSLog(@"= %@",str); } if ([elementName isEqualToString:@"name"]) { NSLog(@"=%@",str); Person *user = [_personArray objectAtIndex:[_personArray count] -1]; user.Name = str; } if ([elementName isEqualToString:@"age"]) { NSLog(@"=%@",str); Person *user = [_personArray objectAtIndex:[_personArray count] -1]; user.age = (int)[str integerValue]; } if ([elementName isEqualToString:@"User"]) { NSLog(@"=%@ ",str); }}//step5 解析结束-(void)parserDidEndDocument:(NSXMLParser *)parser{ for (Person *p in self.personArray) { NSLog(@"%@ %d %@",p.Name,p.Age,p.Pid); }}//解析报错-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ NSLog(@"解析有误 Error:%@",parseError); }- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end

 四、运行结果(显示的内容过长,减少了两个User)

在这里要感谢陈高oliver和袁伟(伟哥)

 

转载地址:http://dlfnl.baihongyu.com/

你可能感兴趣的文章
我的第一个DMZ方案实践
查看>>
HTML5--Video
查看>>
UVM中的regmodel建模(三)
查看>>
如何查看LoadRunner虚拟用户(vuser)类型
查看>>
oracle截取字符串区间段的一部分字符串
查看>>
Ubuntu Gnome 14.04.2 lts 折腾笔记
查看>>
前台的js对象数组传到后台处理。在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>...
查看>>
HTML目录
查看>>
【Hibernate学习笔记-5】@Formula注解的使用
查看>>
java ClassLoader static
查看>>
公司交换机arp 绑定操作
查看>>
东大oj-1511: Caoshen like math
查看>>
在.NET4.5项目中添加HttpClient引用的办法
查看>>
[Android]基于RxJava、RxAndroid的EventBus实现
查看>>
八排序算法
查看>>
.NET/MVC-ViewBag、ViewData、TempData区别
查看>>
Android开发之Bitmap.Config.RGB_565
查看>>
android 实现2张图片层叠效果
查看>>
BI项目记笔记索引
查看>>
OpenCV-CL: OpenCL加速计算机视觉技术
查看>>