网络之XML解析-原生
Json和XML都属于字符串,用于跨平台,前面总结了下Json,下面看下XML。
XML定义这些百度比我说的清,不再啰嗦,直接代码,我喜欢把东西都放进注释。
一、首先看下要解析的XML内容
<?xml version="1.0" encoding="utf-8"?> <Users> <User id="1"> <name>Tom</name> <age>20</age> </User> <User id="2"> <name id = "222">John</name> <age>33</age> </User> <User> <name id = "333">Eric</name> <age>43</age> </User> <User> <name id = "444">Tony</name> <age>54</age> </User> </Users>
二、在项目中添加Person类为其添加属性
// // Person.h // XmlDemo // // Created by City--Online on 15/4/29. // Copyright (c) 2015年 CYW. All rights reserved. // #import <Foundation/Foundation.h> @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 () <NSXMLParserDelegate> @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(@"进入<Users>"); } if ([elementName isEqualToString:@"User"]) { NSLog(@"进入<User>"); Person *user = [[Person alloc] init]; [_personArray addObject:user]; } if ([elementName isEqualToString:@"name"]) { NSLog(@"进入<name>"); Person *user = [_personArray objectAtIndex:[_personArray count] -1]; user.Pid = [attributeDict objectForKey:@"id"]; } if ([elementName isEqualToString:@"age"]) { NSLog(@"进入<age>"); } } //step3 获得首尾标签间 > < 的内容 //此处分几种情况: //1.当标签间内容为“”,如果</></>(如图</age></User></Users>)则进入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(@"</Users>= %@",str); } if ([elementName isEqualToString:@"name"]) { NSLog(@"</name>=%@",str); Person *user = [_personArray objectAtIndex:[_personArray count] -1]; user.Name = str; } if ([elementName isEqualToString:@"age"]) { NSLog(@"</age>=%@",str); Person *user = [_personArray objectAtIndex:[_personArray count] -1]; user.age = (int)[str integerValue]; } if ([elementName isEqualToString:@"User"]) { NSLog(@"</User>=%@ ",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和袁伟(伟哥)
网络之XML解析-原生的更多相关文章
- iOS -数据库网络之xml解析之远程解析XML
1.IOS中XML文件获取 //设置远程访问地址 NSURL *url=[NSURL URLWithString:@""]; //创建动态URL请求,并初 ...
- iOS -数据库网络之xml解析
XML文件有2种解析方式 1.基于文档(document) 2.基于事件(sax) 1.IOS中XML文件获取 首先要将XML导入工程中 在ViewController的按钮事件中,代码如下: ...
- 网络之XML解析-GData
GDataXML是一套Google使用Objective-C开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询, GDataXML 是 iOS 下的一款轻量级 XML 解 ...
- iOS -数据库网络之xml解析之第三方解析XML
1.导入第三方插件(GDalaXMLNode) 2.第三方插件配置 libxml/tree.h 路径 在项目属性中--Bulid Settings中搜索 Search --Search ...
- [iOS 多线程 & 网络 - 2.3] - 解析xml
A.XML基本知识 1.xml概念 什么是XML全称是Extensible Markup Language,译作“可扩展标记语言”跟JSON一样,也是常用的一种用于交互的数据格式一般也叫XML文档(X ...
- iOS开发网络篇—XML数据的解析
iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是 ...
- QF——网络之JSON解析和XML解析
JSON解析和XML解析: 用苹果原生的代理方式的网络请求后返回的都是二进制数据(NSData). 若是json,则通过NSJSONSerialization把NSData数据转换为JSON对象. N ...
- iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)
一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...
- iOS网络-02-数据解析(JSON与XML)
数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...
随机推荐
- ExternalException (0x80004005): GDI+ 中发生一般性错误
.net开发的程序用了一个自绘的框架, 平常部署到IIS上都没有问题,今天突然之间这个功能就运行不起来了. 报错:GDI+错误,然后在本地的VS里面运行是没有问题的 百度出来的改Path环境变量.注册 ...
- matlab 中fft的用法
一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X,N) 用MATLAB进行谱分析时注意: (1)函数FFT返回值的数据结构具有对称性. 例:N=8;n=0:N- ...
- Google guava cache源码解析1--构建缓存器(2)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. CacheBuilder-->maximumSize(long size) /** ...
- Git - 必知必会
配置Git git config --global user.name "your_name" # 配置全局用户名 git config --global user.email & ...
- postgresql-死锁
死锁问题:1.长事务,事务中包含了文书的上传下载,导致其他表的锁等待,最终导致死锁. 2.并发更新,如果更新慢的话,很可能导致,锁等待.需要加for update或者ad lock 3.数据库中查询p ...
- Odoo中使用的数据模型
Odoo中使用的部分表如下, res_users 用户 res_groups 用户组(角色) res_lang 语言 res_partner 供应商/客户/联系人 res_font 字体 res_co ...
- widows下 python环境变量配置
widows下 python环境变量配置 便于cmd命令行操作,例如:直接进入Python解释器环境.使用pip安装模块等.
- C#简单操作MongoDB
一 安装MongoDB 官网按需下载, 安装, 一步到位. 二 VS创建新项目 创建一个.netcore console项目, 然后nuget安装驱动MongoDB.Driver 三 建立连接 在Pr ...
- MVC3学习:实现文章上一篇下一篇链接
文章的显示都是通过id查询数据库来显示.但是文章会经常删除,因此id号可能不是连续的,所以上一篇下一篇文章,不能简单的做id加减法. 我的思路是:先将表格中所有文章的ID号全部放入一个数组中,如果文章 ...
- Windows下调试hadoop
1. 本地模式 本地模式下调试hadoop:下载winutils.exe和hadoop.dll hadoop.lib等windows的hadoop依赖文件放在D:\proc\hadoop\bin目 ...