微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XML和解析

XML和解析 1.什么是XML? Extensible MarkuP Language,可扩展标记语言。 一般也叫XML文档。 和JSON一样,也是常用的一种用于交互的数据格式。 2.XML语法 1)一个常见的XML文档一般由以下部分组成 1>文档声明: 在XML最前面,必须编写一个文档声明,用来声明XML文档的类型。 最简单的声明如:<?xml version='1.0'?> 2>元素(Element) 一个元素包括了开始标签和结束标签。<video>little yellow mn</video> 一个元素可以嵌套若干个子元素(不能出现交叉嵌套)。 注意:XML中的所有换行、空格都是字符,会当作具体内容。 3>属性(Attribute) 一个属性可以拥有多个属性属性值必须用双引号“”或者单引号‘’括住。 实际上,属性表示的信息也可以用子元素来表示。 3.XML解析 解析方式有两种: DOM:一次性将整个XML文档以树形结构加载进内存,内存消耗大,比较适合解析小文件。在iOS开发中不支持DOM方式解析。 SAX:从根元素开始,按顺序一个元素一个元素往下解析,性能好,比较适合解析大文件。苹果推荐使用。 1)苹果原生 NSXMLParser:SAX方式解析,使用简单。 2)第三方框架 libxml2:纯C语言,认包含在iOS SDK中,同时支持DOM和SAX方式解析。 GdataxML:DOM方式解析,由Google开发,基于libxml2. KissXML:DOM方式解析。 3)XML解析方式的选择建议 大文件:NSXMLParser,libxml2 小文件:GdataxML 4.代码示例 -(void)loadData { //1.url NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/video.xml"]; //2.请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3.连接 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response,NSData *data,NSError *connectionError){ //xml的解析 //1.实例化一个xml的解析器,通过代理来实现xml的解析 NSXMLParser *parse = [[NSXMLParser alloc] initWithData:data]; //2.设置代理 parse.delegate = self; //3.解析器开始解析 [parse parse]; }]; } /*代理方法*/ /*1.打开文档,准备开始解析*/ -(void)parserDidStartDocument:(NSXMLParser *)parser { //初始化数组容器,清空容器,便于多次加载数据 [self.vedio removeAllObjects]; } /*2.开始节点*/ -(void)parser:(NSXMLParser *)parser didStartElement:(Nsstring *)elementName namespaceURI:(Nsstring *)namespaceURI qualifiedname:(Nsstring *)qName attributes:(NSDictionary *)attributeDict { //如果开始节点名称是video,就创建一个对象 if([elementName isEqualToString:@"video"]){ self.currentVideo = [[Video alloc] init]; //设置videoID self.currentVideo.videoId = attributeDict[@"videoId"]; } //清空字符串的内容,因为马上需要进入第三步,要开始拼接当前的节点的内容 [self.elementString setString:@""]; } /*3.发现节点里面的内容*/ -(void)parser:(NSXMLParser *)parser foundCharacters:(Nsstring *)string { //开始拼接 [self.elementString appendString:string]; } /*4.结束节点*/ -(void)parser:(NSXMLParser *)parser didEndElement:(Nsstring *)elementName namespaceURI:(Nsstring *)namespaceURI qualifiedname:(Nsstring *)qName { if([elementName isEqualToString:@"video"]){ //如果结束的节点是video,需要把这个对象添加到数组 [self.video addobject:self.currentVideo]; //如果节点结束,就可以把第二步创建的对象,设置name/length属性 else if([elementName isEqualToString:@"name"]){ //设置name //1.直接赋值 self.currentVideo.name = self.elementString; //2.KVC赋值 [self.currentVideo setValue:self.elementString forKey:@"name"]; //3.改造 [self.currentVideo setValue:self.elementString forKey:elementName]; }else if([elementName isEqualToString:@"length"]){ //设置length self.currentVideo.length = @([self.elementString integerValue]); }else if([elementName isEqualToString:@"desc"]){ //设置desc self.currentVideo.desc = self.elementString; } //KVC改进上面的赋值代码 } /*5.结束文档*/ -(void)parserDidEndDocument:(NSXMLParser *)parser { //xml真正解析结束,可以更新UI dispatch_async(dispatch_get_main_queue(),^{ //将容器里的数据(self.videos)赋值给表格显示数据 self.dataList = self.videos; }); } 5.注意点 使用NSNumber防止服务器端返回null,在KVC赋值的时候程序崩溃。 NSNumber *id;是可以使用的,不会导致程序崩溃。 6.GdataxML使用 1)根据报错地方的提示操作,消除错误。 2)代码 -(void)loadData { //1.url NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/video.xml"]; //2.请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3.连接 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response,NSError *connectionError){ //将XML整个读入内存 GdataxMLDocument *document = [[GdataxMLDocument alloc]initWithData:data error:NULL]; for(GdataxMLElement *element in document.rootElement.children){ //创建video对象 Video *video = [[Video alloc] init]; for(GdataxMLElement *node in element.children){ NSLog(@"%@,%@",node.name,node.stringValue); //KVC赋值 [video setValue:node.stringValue forKey:node.name]; } NSLog(@"%@",element.attributes); //遍历element.attributes数组,拿到属性值 for(GDtatXMLNode *att in element.attributes){ //KVC赋值 [video setValue:att.stringValue forKey:att.name]; } //模型添加到数组 [self.videos addobject:video]; } }]; }

原文地址:https://www.jb51.cc/xml/296005.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。