iOS开发XML解析
xml解析主要可以使用CData,libxml2以及NSXMLParser,以下对各个方法给出了相应的例子:
1.CDataXML:
1.1.创建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
1.2.创建 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:xmlName
ofType:@"xml"];
// 使用NSFileHandle对象根据文件路径获取到文件
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
// 读取文件内容返回NSData对象
NSData *data = [file readDataToEndOfFile];
// 根据NSData对象初始化GDataXMLDocument对象
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data
options: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
1.3.创建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 *)tableView
numberOfRowsInSection:(NSInteger)section
{
// books属性包含多少个元素,此处就显示多少个表格行。
return books.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(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
2.libxml2XML:
2.1.创建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
2.2.创建 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:xmlName
ofType:@"xml"];
// 使用NSFileHandle对象根据文件路径获取到文件
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
// 读取文件内容返回NSData对象
NSData *data = [file readDataToEndOfFile];
// 根据NSData对象初始化GDataXMLDocument对象
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data
options: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
2.3创建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 *)tableView
numberOfRowsInSection:(NSInteger)section
{
// booksParser的books属性包含多少个元素,此处就显示多少个表格行。
return booksParser.books.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(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
3.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 *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
attributes:(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 *)elementName
namespaceURI:(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解析和下拉刷新,上拉加载更多
iOS开发 XML解析和下拉刷新,上拉加载更多 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示 ...
- 2016 - 1- 23 iOS中xml解析 (!!!!!!!有坑要解决!!!!!!)
一: iOS中xml解析的几种方式简介 1.官方原生 NSXMLParser :SAX方式解析,使用起来比较简单 2.第三方框架 libxml2 :纯C 同时支持DOM与SAX GDataXML: D ...
- iOS开发之解析XML格式数据
XML格式的数据是一种数据的传输格式.因为它方便编写.结构清晰,所以深受程序猿的喜爱,非常多人都喜欢使用XML格式数据传输或者作为程序的配置信息. 如今我将来实如今iOS中解析XML格式数据,语言使用 ...
- iOS平台XML解析类库对比和安装说明
在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...
- 【IOS】 XML解析和xml转plist文件(GDataXML)
iOS对于XML的解析有系统自带的SDK--NSXMLParser,鄙人愚拙,只会用GDataXML进行解析,这里仅介绍GData的使用.(以下图为例) 1.对于一个xml文件,先读取出来 NSDat ...
- iOS - OC - XML 解析 - NSXMLParser
//4.解析数据 //4.1 创建XML解析器:SAX NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; //4.2 设置代理 ...
- iOS开发——XML/JSON数据解析
NSJSONSerialization 接下来就正式开始.苹果官方给出的解析方式是性能最优越的,虽然用起来稍显复杂. 首先我们在上面已经有了我希望得到的信息的网站的API给我们的URL,在OC中,我要 ...
- iOS开发-简单解析JSON数据
什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {“nam ...
- iOS开发-JSON解析
JSON(JavaScript Object Notation)在网络传输中几乎无处不在,JSON是一种轻量级的数据交换格式,是基于JavaScript(Standard ECMA-262 3rd E ...
随机推荐
- silverlight 使用IValueConverter 转换
在绑定数据中 有时候我们需要转换相关数据类型 silverlight提供了一个System.Windows.Data.IValueConverter接口它提供两个方法 Convert和ConvertB ...
- RecyclerView 局部刷新(获取viewHolder 去刷新)
RecyclerView.ViewHolder viewHolder = mRecyclerView.findViewHolderForAdapterPosition(i); if (viewHold ...
- Cow Marathon(树的直径)
传送门 Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5362 Accepted: 2634 ...
- 【旧文章搬运】从PEB获取内存中模块列表
原文发表于百度空间,2008-7-25========================================================================== PEB中的L ...
- excel的部分使用方法
第一行数据填充下面所有行的快捷键,ctrl+d 两个表关联替换:=VLOOKUP(H1576,Sheet3!$B$2:$C$315,2,0) 取消下拉框:数据>数据有效性>全部清除 快捷选 ...
- Struts2基本使用
Struts2:本质servlet 1.接受页面参数 a.使用原生的ServletAPI接受(不推荐) request.getParameter(name) 获取元素request方式: --Http ...
- error: expected ‘)’ before ‘PRId64’(转载)
转自:www.xuebuyuan.com/2077822.html error: expected ‘)’ before ‘PRId64’ 原来这个宏定义给c用的,C++要用它,就要定义一个__STD ...
- Gradle技术之四 - Gradle的Task详解
1 Gradle的Task详解 1 Task定义和配置 2 Task的执行 3 Task的依赖和执行顺序 4 Task类型 5 Task结合gradle的生命周期 6 Task实战 1.1 Task定 ...
- Codeforces - 1114C - Trailing Loves (or L'oeufs?) - 简单数论
https://codeforces.com/contest/1114/problem/C 很有趣的一道数论,很明显是要求能组成多少个基数. 可以分解质因数,然后统计各个质因数的个数. 比如8以内,有 ...
- 11.5NOIP模拟赛
/* 唉,那个第二种策略应该是没用吧. 为什么我列出式子最优策略跟第二种策略有关??为什么我写了写分布列还是跟第二种策略有关??为什么数学还没学到期望的孩子们都A了? 唉.人生啊. 0.5h后 我好像 ...