iOS开发之解析XML数据
XML解析主要可以使用CData,libxml2以及NSXMLParser三种方式。
一、CDataXML
- 创建FKBook类
#import <Foundation/Foundation.h>@interface FKBook : NSObject
@property (nonatomic , assign) NSInteger bookID;
@property (nonatomic , copy) NSString *title;
@property (nonatomic , copy) NSString *author;
@property (nonatomic , copy) NSString *remark;
@end#import "FKBook.h"@implementation FKBook
@synthesize bookID,title,author,remark;
@end
- 创建 FKBooksParser 类
#import <Foundation/Foundation.h>@interface FKBooksParser : NSObject
- (NSArray*) parseXML:(NSString*) xmlName;
@end#import "FKBooksParser.h"
#import "FKBook.h"
#import "GDataXMLNode.h"@implementation FKBooksParser- (NSArray*) parseXML:(NSString*) xmlName {// 使用NSBundle对象获取到需要解析的XML文档的路径NSString *path = [[NSBundle mainBundle] pathForResource:xmlNameofType:@"xml"];// 使用NSFileHandle对象根据文件路径获取到文件NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];// 读取文件内容返回NSData对象NSData *data = [file readDataToEndOfFile];// 根据NSData对象初始化GDataXMLDocument对象GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:dataoptions:0 error:nil];// 如果需要根据XML字符串来初始化GDataXMLDocument对象,则调用如下代码
// GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithXMLString:xmlStr
// options:0 error:nil];// 获取根元素,也就是获取<books.../>元素GDataXMLElement *rootElement = [doc rootElement];// 获取rootElement下所有<book.../>元素,返回所有<book.../>元素组成的集合NSArray *bookElements = [rootElement elementsForName:@"book"];// 初始化一个可变数组,用于存储将要获取的所有<book.../>元素的内容NSMutableArray *books = [[NSMutableArray alloc] init];// 循环遍历每一个<book.../>元素for(GDataXMLElement *bookElement in bookElements){// 初始化FKBook对象FKBook *book = [[FKBook alloc] init];// 获取id属性值,并且转成整形NSInteger bookID = [[[bookElement attributeForName:@"id"]stringValue] integerValue];// 获取title,author,remark元素内容NSString *title = [[[bookElement elementsForName:@"title"]objectAtIndex:0] stringValue];NSString *author = [[[bookElement elementsForName:@"author"]objectAtIndex:0] stringValue];NSString *remark = [[[bookElement elementsForName:@"remark"]objectAtIndex:0] stringValue];// 将获取的属性值和元素内容存储到FKBook对象的属性中book.bookID = bookID;book.title = title;book.author = author;book.remark = remark;//将每一个Book对象添加到可变数组[books addObject:book];}//返回books集合的副本return [books copy];
}
@end
- 创建FKViewController : UITableViewController
#import "FKViewController.h"
#import "FKBooksParser.h"
#import "FKBook.h"@implementation FKViewController
NSArray* books;
- (void)viewDidLoad {[super viewDidLoad];// 获取FKBooksParser实例对象FKBooksParser* booksParser = [[FKBooksParser alloc] init];// 解析XML文档,获取解析得到的NSArray集合books =[booksParser parseXML:@"books"];
}- (NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section {// books属性包含多少个元素,此处就显示多少个表格行。return books.count;
}- (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath {// 获取可重用的单元格UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"bookCell" forIndexPath:indexPath];// 从可重用单元格中根据Tag分别取出3个UILabel控件UILabel* titleLabel = (UILabel*)[cell viewWithTag:1];UILabel* authorLabel = (UILabel*)[cell viewWithTag:2];UILabel* remarkLabel = (UILabel*)[cell viewWithTag:3];FKBook* book = [books objectAtIndex:indexPath.row];// 为3个UILabel设置文本titleLabel.text = book.title;authorLabel.text = book.author;remarkLabel.text = book.remark;return cell;
}
@end
二、libxml2XML
- 创建FKBook类:
#import <Foundation/Foundation.h>@interface FKBook : NSObject
@property (nonatomic , assign) NSInteger bookID;
@property (nonatomic , copy) NSString *title;
@property (nonatomic , copy) NSString *author;
@property (nonatomic , copy) NSString *remark;
@end#import "FKBook.h"@implementation FKBook
@synthesize bookID,title,author,remark;
@end
- 创建 FKBooksParser 类:
#import <Foundation/Foundation.h>@interface FKBooksParser : NSObject
- (NSArray*) parseXML:(NSString*) xmlName;
@end#import "FKBooksParser.h"
#import "FKBook.h"
#import "GDataXMLNode.h"@implementation FKBooksParser- (NSArray*) parseXML:(NSString*) xmlName {// 使用NSBundle对象获取到需要解析的XML文档的路径NSString *path = [[NSBundle mainBundle] pathForResource:xmlNameofType:@"xml"];// 使用NSFileHandle对象根据文件路径获取到文件NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];// 读取文件内容返回NSData对象NSData *data = [file readDataToEndOfFile];// 根据NSData对象初始化GDataXMLDocument对象GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:dataoptions:0 error:nil];// 如果需要根据XML字符串来初始化GDataXMLDocument对象,则调用如下代码
// GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithXMLString:xmlStr
// options:0 error:nil];// 获取根元素,也就是获取<books.../>元素GDataXMLElement *rootElement = [doc rootElement];// 获取rootElement下所有<book.../>元素,返回所有<book.../>元素组成的集合NSArray *bookElements = [rootElement elementsForName:@"book"];// 初始化一个可变数组,用于存储将要获取的所有<book.../>元素的内容NSMutableArray *books = [[NSMutableArray alloc] init];// 循环遍历每一个<book.../>元素for(GDataXMLElement *bookElement in bookElements){// 初始化FKBook对象FKBook *book = [[FKBook alloc] init];// 获取id属性值,并且转成整形NSInteger bookID = [[[bookElement attributeForName:@"id"]stringValue] integerValue];// 获取title,author,remark元素内容NSString *title = [[[bookElement elementsForName:@"title"]objectAtIndex:0] stringValue];NSString *author = [[[bookElement elementsForName:@"author"]objectAtIndex:0] stringValue];NSString *remark = [[[bookElement elementsForName:@"remark"]objectAtIndex:0] stringValue];// 将获取的属性值和元素内容存储到FKBook对象的属性中book.bookID = bookID;book.title = title;book.author = author;book.remark = remark;//将每一个Book对象添加到可变数组[books addObject:book];}//返回books集合的副本return [books copy];
}
@end
- 创建FKViewController : UITableViewController
#import "FKViewController.h"
#import "FKBooksParser.h"
#import "FKBook.h"@implementation FKViewController
FKBooksParser* booksParser;
- (void)viewDidLoad {[super viewDidLoad];// 获取FKBooksParser实例对象booksParser = [[FKBooksParser alloc] init];// 解析XML文档[booksParser readXml:@"books"];
}- (NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section {// booksParser的books属性包含多少个元素,此处就显示多少个表格行。return booksParser.books.count;
}- (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath
{// 获取可重用的单元格UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"bookCell" forIndexPath:indexPath];// 从可重用单元格中根据Tag分别取出3个UILabel控件UILabel* titleLabel = (UILabel*)[cell viewWithTag:1];UILabel* authorLabel = (UILabel*)[cell viewWithTag:2];UILabel* remarkLabel = (UILabel*)[cell viewWithTag:3];FKBook* book = [booksParser.books objectAtIndex:indexPath.row];// 为3个UILabel设置文本titleLabel.text = book.title;authorLabel.text = book.author;remarkLabel.text = book.remark;NSLog(@"---%d" , book.bookID);return cell;
}
@end
三、NSXMLParser
#import <Foundation/Foundation.h>@interface FKXMLPraserDelegate : NSObject <NSXMLParserDelegate>
// 定义一个NSMutableArray集合来保存解析XML文档得到的数据
@property (nonatomic, strong) NSMutableArray *books;
@end#import "FKXMLPraserDelegate.h"
#import "FKBook.h"@implementation FKXMLPraserDelegate
// 定义一个FKBook对象,用于保存正在解析的<book>元素中的数据
FKBook* book;
NSString* currentElementValue;
// 当开始处理某个元素时触发该方法
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qNameattributes:(NSDictionary *)attributeDict {NSLog(@"开始处理元素 %@" , elementName);if([elementName isEqualToString:@"books”]) {// 如果正在处理根元素,在此处初始化存储解析结果的NSMutableArray集合self.books = [[NSMutableArray alloc] init];}// 如果正在处理<book.../>元素else if([elementName isEqualToString:@"book"]){// 初始化FKBook对象book = [[FKBook alloc] init];// 从attributeDict中读取<book.../>元素的属性id的值book.bookID = [[attributeDict objectForKey:@"id"] integerValue];}
}
// 当开始处理字符串内容时触发该方法
-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {NSLog(@"处理字符串内容:%@",string);// 如果当前的字符串值不为nil,保存当前正在处理的元素的值if(string){currentElementValue = string;}}
// 当处理某个元素结束时触发该方法
-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {// 如果处理根元素结束,表明XML文档处理完成。if([elementName isEqualToString:@"books"]){return;}// 如果处理<book.../>元素结束,则将封装的FKBook对象添加到NSMutableArray集合中else if([elementName isEqualToString:@"book"]){[self.books addObject: book];book = nil;}else{// 如果既不是处理<books.../>元素,也不是处理<book.../>元素的时候,// 则使用KVC方式为当前FKBook对象的属性赋值[book setValue:currentElementValue forKey:elementName];currentElementValue = nil;}
}
@end
iOS开发之解析XML数据相关推荐
- iOS开发之解析XML格式数据
XML格式的数据是一种数据的传输格式.因为它方便编写.结构清晰,所以深受程序猿的喜爱,非常多人都喜欢使用XML格式数据传输或者作为程序的配置信息. 如今我将来实如今iOS中解析XML格式数据,语言使用 ...
- iOS开发-简单解析JSON数据
什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"na ...
- [iOS] dom解析xml数据,拿到lt;gt;里面的值
[iOS] dom解析xml数据,拿到<>里面的值 <response result="success" timestamp="1338890206&q ...
- 零基础iOS之Json及XML数据解析2
零基础iOS之Json及XML数据解析http://www.cnblogs.com/dingjianjaja/articles/4798604.html 转载于:https://www.cnblogs ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 解析xml数据存入bean映射到数据库的 需求解决过程
解析xml数据存入bean映射到数据库的 需求解决过程 2017年12月19日 15:18:57 守望dfdfdf 阅读数:419 标签: xmlbean 更多 个人分类: 工作 问题 编辑 版权声明 ...
- TinyXML-2解析XML数据
声明 本文例子源自在C++中使用TinyXML2解析xml一文,其余部分来源于网络搜集,难免疏漏,敬请随意吐槽. XML以及JSON 什么是XML 根据Wikipedia-XML的说法: 可扩展标记语 ...
- 【Android Developers Training】 81. 解析XML数据
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Java中级篇】Dom4j解析xml数据
一.依赖 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId> ...
最新文章
- 【深度学习】医学图像分割多标签损失函数和极坐标变换
- Linux C 串口属性设置
- 第九周 10.25-10.31
- 为机场按上一双“慧眼”消灭飞机的“黑色十分钟”
- 【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先
- Windows操作系统 | Visual C++库可不能乱删
- 苹果CMSv10新手入门安装必看教程
- keil5写c语言的步骤,keil5使用C51的详细操作步骤
- Dynamo For Revit: 简单体量的创建
- php融云开源sdk使用im,开源项目索引
- 利用Apache Tika分页解析pdf文件内容
- xbox手柄适配器驱动_用于Windows的Xbox 360控制器无线接收器适配器
- 极狐GitLab 连接 minikube集群
- 苹果手机该如何拍摄证件照
- revit里的BIM模型转fbx真的可以带纹理材质吗?
- 峰哥买房用的贝壳app,他们的大数据平台如何实现的?
- Lenovo 使用BoMC工具制作微码升级U盘刷新System x
- Linux模板机及集群相关操作
- 西欧5800计算器坐标正反算程序
- [联想官方工具]关闭Win10自动更新工具 最新版 2.6.21.816
热门文章
- 阮一峰:Flex 布局教程
- 科讯CMS--用SQL标签时提示内存不够
- Oracle数据库安然计谋分析(二)
- 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)
- mysql5.7环境搭建_mysql5.7.13环境搭建教程(解压缩版)
- apk 反编译_APK反编译与回编译修改包名实现分身
- python获取qq好友ip_qqzeng-ip.dat IP库读取python版
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 002---tcp/ip五层详解
- C# 弹出确定、取消窗口