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数据相关推荐

  1. iOS开发之解析XML格式数据

    XML格式的数据是一种数据的传输格式.因为它方便编写.结构清晰,所以深受程序猿的喜爱,非常多人都喜欢使用XML格式数据传输或者作为程序的配置信息. 如今我将来实如今iOS中解析XML格式数据,语言使用 ...

  2. iOS开发-简单解析JSON数据

    什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"na ...

  3. [iOS] dom解析xml数据,拿到lt;gt;里面的值

    [iOS] dom解析xml数据,拿到<>里面的值 <response result="success" timestamp="1338890206&q ...

  4. 零基础iOS之Json及XML数据解析2

    零基础iOS之Json及XML数据解析http://www.cnblogs.com/dingjianjaja/articles/4798604.html 转载于:https://www.cnblogs ...

  5. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  6. 解析xml数据存入bean映射到数据库的 需求解决过程

    解析xml数据存入bean映射到数据库的 需求解决过程 2017年12月19日 15:18:57 守望dfdfdf 阅读数:419 标签: xmlbean 更多 个人分类: 工作 问题 编辑 版权声明 ...

  7. TinyXML-2解析XML数据

    声明 本文例子源自在C++中使用TinyXML2解析xml一文,其余部分来源于网络搜集,难免疏漏,敬请随意吐槽. XML以及JSON 什么是XML 根据Wikipedia-XML的说法: 可扩展标记语 ...

  8. 【Android Developers Training】 81. 解析XML数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Java中级篇】Dom4j解析xml数据

    一.依赖 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId> ...

最新文章

  1. 【深度学习】医学图像分割多标签损失函数和极坐标变换
  2. Linux C 串口属性设置
  3. 第九周 10.25-10.31
  4. 为机场按上一双“慧眼”消灭飞机的“黑色十分钟”
  5. 【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先
  6. Windows操作系统 | Visual C++库可不能乱删
  7. 苹果CMSv10新手入门安装必看教程
  8. keil5写c语言的步骤,keil5使用C51的详细操作步骤
  9. Dynamo For Revit: 简单体量的创建
  10. php融云开源sdk使用im,开源项目索引
  11. 利用Apache Tika分页解析pdf文件内容
  12. xbox手柄适配器驱动_用于Windows的Xbox 360控制器无线接收器适配器
  13. 极狐GitLab 连接 minikube集群
  14. 苹果手机该如何拍摄证件照
  15. revit里的BIM模型转fbx真的可以带纹理材质吗?
  16. 峰哥买房用的贝壳app,他们的大数据平台如何实现的?
  17. Lenovo 使用BoMC工具制作微码升级U盘刷新System x
  18. Linux模板机及集群相关操作
  19. 西欧5800计算器坐标正反算程序
  20. [联想官方工具]关闭Win10自动更新工具 最新版 2.6.21.816

热门文章

  1. 阮一峰:Flex 布局教程
  2. 科讯CMS--用SQL标签时提示内存不够
  3. Oracle数据库安然计谋分析(二)
  4. 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)
  5. mysql5.7环境搭建_mysql5.7.13环境搭建教程(解压缩版)
  6. apk 反编译_APK反编译与回编译修改包名实现分身
  7. python获取qq好友ip_qqzeng-ip.dat IP库读取python版
  8. 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
  9. 002---tcp/ip五层详解
  10. C# 弹出确定、取消窗口