xml和json浅析(日后有待补充)
来源:互联网 发布:彩票分析软件下载 编辑:程序博客网 时间:2024/05/18 19:21
由于256那边在完善基础功能和界面阶段,在想到新的功能前,同时学习或者复习一些其他内容,所以就从网络通信开始下手,而网络通信的数据xml和json自然也就需要了解了。
XML:
基本机构元素分为element、attribute、content,当然element里是可以嵌套childElement的,解析规范分为DOM(Document Object Model)(日后补充)和SAX(Simple API for XML)。
SAX解析器在解析XML文件的各个元素时会触发各种事件(或者说各种方法),可以在各种方法中对各元素数据进行处理,从而达到获取或修改XML数据的目的。
由于SAX解析器不用将整个XML数据存放在内存中(DOM的做法),所以占用内存极小,速度更快。
IOS SDK自带NSXMLParser和libxml2(日后补充)两种解析器(学习阶段现已IOS SDK为主,暂不考虑第三方)。
NSXMLParser
NSXMLParser解析属于委托事件处理,所以需要为NSXMLParser制定一个delegate对象,而该delegate对象需要实现NSXMLParserDeledate协议,协议方法(按需实现,不用全部实现)如下:
- -parserDidStartDocument: 开始解析XML文档时触发该方法。
- -parserDidEndDocument: 结束解析XML文档时触发该方法。
- -parser:didStartElement:namespaceURI:qualifiedName: 开始处理XML element时触发该方法。
- -parser:didEndElement:namespaceURI:qualifiedName: 结束处理XML element时触发该方法。
- -parser:resolveExternalEntityName:systemID: 开始处理外部实体时触发该方法。
- -parser:parserErrorOccurred: 解析出错时触发该方法。
- -parser:validationErrorOccurred: XML文档验证错误时触发该方法。
- -parser:foundCharacters: 解析XML文档遇到字符串内容是触发该方法。
- -parser:foundIgnorableWhitespace: 解析XML文档遇到空白时触发该方法。
- -parser:foundProcessingInstructionWithTarget:data: 解析XML文档的处理指令是触发该方法。
- -parser:foundComment: 处理XML文档的注释时触发该方法。
- -parser:foundCDATA: 处理XML文档的CDATA内容时触发该方法。
delegate头文件
//遵守NSXMLParserDelegate协议@interface MyXMLPaserDelegate : NSObject <NSXMLPaserDelegate>//定义NSMutableArray * cities保存数据@property (nonatomic, strong) NSMutableArray * cities;@end
delegate实现文件
@implementation MyXMLParserDelegate//定义city来保存具体城市的天气数据CityWeather * city;//定义一个NSString * currentValue用来获取element的内容NSString * currentValue;//开始解析element时触发该方法-(void)parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *) attributeDict{ //当解析的是rootElement时,说明开始解析第一层,此时可声明self.cities if(elementName isEqualTo:@"cities") { self.cities = [[NSMutableArray alloc] init]; }else if(elementName isEqualTo:@"city") //如果是city element,则处理信息 { city = [[CityWeather alloc] init]; city.weather = [attributeDict objectForKey:@"weather"]; }}//处理字符串时,将字符串保存起来,以便在之后的方法中相应赋值-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *) content{ //如果content不为空 if(content) { currentValue = content; }}//当某element解析结束时触发该方法,为相应数据赋值处理-(void)parser:(NSXMLParser *) parser didEndElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qualifiedName{ //如果是rootElement,则表示解析结束 if(elementName isEqualTo:@"cities") { return; }else if (elementName isEqualTo:@"city") //如果是city,将city添加到cities中,再将city值nil,以便下次利用 { [self.cities addobject:city]; city = nil; }else //如果是非rootElement或city的其他element,如city的chileElement,则将childElement添加到city对应的属性值上。 { [city setValue:currentValue forKey:elementName]; currentValue = nil; }}@end
controller implementation
@implementation MyViewControllerMyXMLParserDelegate * parserDelegate;-(void)viewDidLoad{ [super viewDidLoad]; //XML文件的URL地址 NSURL * XMLUrl = [[NSBundle mainBundle] URLForResource:@"cities" withExtension:@"xml"]; //获取NSXMLParser变量 NSXMLParser * parser = [[NSXMLParser alloc] initWithContentOfURL:XMLURL]; //创建NSXMLParserDelegate对象 parserDelegate = [[NSXMLParserDelegate alloc] init]; //将parserDelegate指定为parser的委托对象 parser.delegate = parserDelegate; //开始解析 [parser parser]; //解析结果会保存在parserDelegate.cities中,之后想要调用数据时调用parserDelegate.cities即可}
JSON
JSON主要有以下两种数据结构:
- 由key-value对组成的数据结构(OC中的NSDictionary,由{}表示)。
- 有序集合(OC中的NSArray,由[]或()表示)。
可使用NSJSONSerialization的如下方法来处理JSON数据:
- +JSONObjectWithData:options:error: 将制定的NSData中包含的JSON数据转换为Object-C对象。
- +JSONObjectWithStream:options:error: 将制定输入流中包含的JSON数据转换为Object-C对象。
- +dataWithJSONObject:options:error: 将制定的JSON对象转换为NSData对象。
- +writeJSONObject:toStream:options:error:将制定的JSON对象转换为JSON字符串输出到制定输出流。
+isValidJSONObject: 验证制定对象是否可以正常转换为JSON数据。
如下JSON数据:
{ "results":[ { "location":{"id":"WX4FBXXFKE4F","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"}, "now":{"text":"中雨","code":"14","temperature":"16"}, "last_update":"2017-05-22T12:20:00+08:00" } ] }
可如此解析:
@implementation WeatherModel@synthesize weather;//用获取的含有JSON数据的NSDATA来创建WeatherModel的方法+(id)initWithData:(NSData *) data{ //由于JSON数据的第一层是用{},所以判断为NSDictionary数据,用NSJSONSerialization进行解析 NSDictionary * dict = [NSJSONSerialization JSONObjectWithData: data options:(NSJSONReadingMutableLeaves) error:nil]; return [[self alloc] initWithDic:dict];}-(id)initWithDic:(NSDictionary *) dict{ self = [super init]; //第二层只有一对[],所以判断为一个NSArray数据 NSArray * results = [dict objectForKey:@"results"]; //第三层只有一对{},所以判断为一个NSDictionary数据 NSDictionary * result = [results lastObject]; NSDictionary * nowWeather = [result objectForKey:@"now"]; self.weather = [nowWeather objectForKey:@"text"]; //类似的可以将JSON中各数据写入WeatherModel的成员变量中,需要调用数据是,调用对应的成员变量即可 return self;}
阅读全文
0 0
- xml和json浅析(日后有待补充)
- 算法思想汇总(日后补充)
- NSURLSession简单使用(日后补充)
- 多线程一些简单知识(日后补充)
- JSON和XML的区别浅析
- IO流一些基本内容(日后补充)
- 网络编程UDP与TCP(基础知识,日后补充)
- 排序 有待补充
- XML vs JSON 浅析
- list转化成json(有待改进)
- ff activex ocx 有待补充,有待验证
- 几个常见的Css样式的写法(有待补充)
- Java中是怎么杀死线程的??(有待补充)
- 在看或已看书单(有待补充)
- 电子技术书籍(日本)——有待补充完善
- redis应用和原理(日后更新)
- 排序算法 笔记 有待补充
- Matlab快捷操作(有待补充)
- JavaScript遍历json对象 (包括所有key及根据动态key获取值)
- 包装类、自动装箱、自动拆箱
- redis如何清除所有的key
- HDU1166 线段树区间求和,单点更新
- 2017 计蒜客初赛 第二场 A 百度的年会游戏
- xml和json浅析(日后有待补充)
- Java异常处理
- Shell输入输出重定向
- TOP命令
- javascript中的“this”总结
- 穷不可怕,可怕的是“穷人思维”
- Date--时间类
- Fibonacci数
- 原生js封装ajax函数