xml解析主要可以使用CData,libxml2以及NSXMLParser,以下对各个方法给出了相应的例子:

1.CDataXML:

1.1.创建FKBook类

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface FKBook : NSObject
  4. @property (nonatomic , assign) NSInteger bookID;
  5. @property (nonatomic , copy) NSString *title;
  6. @property (nonatomic , copy) NSString *author;
  7. @property (nonatomic , copy) NSString *remark;
  8. @end

#import "FKBook.h"

@implementation FKBook 
@synthesize bookID,title,author,remark; 
@end 
1.2.创建 FKBooksParser 类

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface FKBooksParser : NSObject
  4. - (NSArray*) parseXML:(NSString*) xmlName;
  5. @end
  1. #import "FKBooksParser.h"
  2. #import "FKBook.h"
  3. #import "GDataXMLNode.h"
  4.  
  5. @implementation FKBooksParser
  6.  
  7. - (NSArray*) parseXML:(NSString*) xmlName
  8. {
  9. // 使用NSBundle对象获取到需要解析的XML文档的路径
  10. NSString *path = [[NSBundle mainBundle] pathForResource:xmlName
  11. ofType:@"xml"];
  12. // 使用NSFileHandle对象根据文件路径获取到文件
  13. NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
  14. // 读取文件内容返回NSData对象
  15. NSData *data = [file readDataToEndOfFile];
  16. // 根据NSData对象初始化GDataXMLDocument对象
  17. GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data
  18. options:0 error:nil];
  19. // 如果需要根据XML字符串来初始化GDataXMLDocument对象,则调用如下代码
  20. // GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithXMLString:xmlStr
  21. // options:0 error:nil];
  22. // 获取根元素,也就是获取<books.../>元素
  23. GDataXMLElement *rootElement = [doc rootElement];
  24. // 获取rootElement下所有<book.../>元素,返回所有<book.../>元素组成的集合
  25. NSArray *bookElements = [rootElement elementsForName:@"book"];
  26. // 初始化一个可变数组,用于存储将要获取的所有<book.../>元素的内容
  27. NSMutableArray *books = [[NSMutableArray alloc] init];
  28. // 循环遍历每一个<book.../>元素
  29. for(GDataXMLElement *bookElement in bookElements)
  30. {
  31. // 初始化FKBook对象
  32. FKBook *book = [[FKBook alloc] init];
  33. // 获取id属性值,并且转成整形
  34. NSInteger bookID = [[[bookElement attributeForName:@"id"]
  35. stringValue] integerValue];
  36. // 获取title,author,remark元素内容
  37. NSString *title = [[[bookElement elementsForName:@"title"]
  38. objectAtIndex:0] stringValue];
  39. NSString *author = [[[bookElement elementsForName:@"author"]
  40. objectAtIndex:0] stringValue];
  41. NSString *remark = [[[bookElement elementsForName:@"remark"]
  42. objectAtIndex:0] stringValue];
  43. // 将获取的属性值和元素内容存储到FKBook对象的属性中
  44. book.bookID = bookID;
  45. book.title = title;
  46. book.author = author;
  47. book.remark = remark;
  48. //将每一个Book对象添加到可变数组
  49. [books addObject:book];
  50. }
  51. //返回books集合的副本
  52. return [books copy];
  53. }
  54. @end

1.3.创建FKViewController : UITableViewController

  1. #import "FKViewController.h"
  2. #import "FKBooksParser.h"
  3. #import "FKBook.h"
  4.  
  5. @implementation FKViewController
  6. NSArray* books;
  7. - (void)viewDidLoad
  8. {
  9. [super viewDidLoad];
  10. // 获取FKBooksParser实例对象
  11. FKBooksParser* booksParser = [[FKBooksParser alloc] init];
  12. // 解析XML文档,获取解析得到的NSArray集合
  13. books =[booksParser parseXML:@"books"];
  14. }
  15. - (NSInteger)tableView:(UITableView *)tableView
  16. numberOfRowsInSection:(NSInteger)section
  17. {
  18. // books属性包含多少个元素,此处就显示多少个表格行。
  19. return books.count;
  20. }
  21. - (UITableViewCell *)tableView:(UITableView *)tableView
  22. cellForRowAtIndexPath:(NSIndexPath *)indexPath
  23. {
  24. // 获取可重用的单元格
  25. UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:
  26. @"bookCell" forIndexPath:indexPath];
  27. // 从可重用单元格中根据Tag分别取出3个UILabel控件
  28. UILabel* titleLabel = (UILabel*)[cell viewWithTag:1];
  29. UILabel* authorLabel = (UILabel*)[cell viewWithTag:2];
  30. UILabel* remarkLabel = (UILabel*)[cell viewWithTag:3];
  31. FKBook* book = [books objectAtIndex:indexPath.row];
  32. // 为3个UILabel设置文本
  33. titleLabel.text = book.title;
  34. authorLabel.text = book.author;
  35. remarkLabel.text = book.remark;
  36. return cell;
  37. }
  38. @end

2.libxml2XML:

  1. 2.1.创建FKBook
  2.  
  3. #import <Foundation/Foundation.h>
  4.  
  5. @interface FKBook : NSObject
  6. @property (nonatomic , assign) NSInteger bookID;
  7. @property (nonatomic , copy) NSString *title;
  8. @property (nonatomic , copy) NSString *author;
  9. @property (nonatomic , copy) NSString *remark;
  10. @end
  11.  
  12. #import "FKBook.h"
  13.  
  14. @implementation FKBook
  15. @synthesize bookID,title,author,remark;
  16. @end
  17. 2.2.创建 FKBooksParser
  18.  
  19. #import <Foundation/Foundation.h>
  20.  
  21. @interface FKBooksParser : NSObject
  22. - (NSArray*) parseXML:(NSString*) xmlName;
  23. @end
  24.  
  25. #import "FKBooksParser.h"
  26. #import "FKBook.h"
  27. #import "GDataXMLNode.h"
  28.  
  29. @implementation FKBooksParser
  30.  
  31. - (NSArray*) parseXML:(NSString*) xmlName
  32. {
  33. // 使用NSBundle对象获取到需要解析的XML文档的路径
  34. NSString *path = [[NSBundle mainBundle] pathForResource:xmlName
  35. ofType:@"xml"];
  36. // 使用NSFileHandle对象根据文件路径获取到文件
  37. NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
  38. // 读取文件内容返回NSData对象
  39. NSData *data = [file readDataToEndOfFile];
  40. // 根据NSData对象初始化GDataXMLDocument对象
  41. GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data
  42. options:0 error:nil];
  43. // 如果需要根据XML字符串来初始化GDataXMLDocument对象,则调用如下代码
  44. // GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithXMLString:xmlStr
  45. // options:0 error:nil];
  46. // 获取根元素,也就是获取<books.../>元素
  47. GDataXMLElement *rootElement = [doc rootElement];
  48. // 获取rootElement下所有<book.../>元素,返回所有<book.../>元素组成的集合
  49. NSArray *bookElements = [rootElement elementsForName:@"book"];
  50. // 初始化一个可变数组,用于存储将要获取的所有<book.../>元素的内容
  51. NSMutableArray *books = [[NSMutableArray alloc] init];
  52. // 循环遍历每一个<book.../>元素
  53. for(GDataXMLElement *bookElement in bookElements)
  54. {
  55. // 初始化FKBook对象
  56. FKBook *book = [[FKBook alloc] init];
  57. // 获取id属性值,并且转成整形
  58. NSInteger bookID = [[[bookElement attributeForName:@"id"]
  59. stringValue] integerValue];
  60. // 获取title,author,remark元素内容
  61. NSString *title = [[[bookElement elementsForName:@"title"]
  62. objectAtIndex:0] stringValue];
  63. NSString *author = [[[bookElement elementsForName:@"author"]
  64. objectAtIndex:0] stringValue];
  65. NSString *remark = [[[bookElement elementsForName:@"remark"]
  66. objectAtIndex:0] stringValue];
  67. // 将获取的属性值和元素内容存储到FKBook对象的属性中
  68. book.bookID = bookID;
  69. book.title = title;
  70. book.author = author;
  71. book.remark = remark;
  72. //将每一个Book对象添加到可变数组
  73. [books addObject:book];
  74. }
  75. //返回books集合的副本
  76. return [books copy];
  77. }
  78. @end

2.3创建FKViewController : UITableViewController

  1. #import "FKViewController.h"
  2. #import "FKBooksParser.h"
  3. #import "FKBook.h"
  4.  
  5. @implementation FKViewController
  6. FKBooksParser* booksParser;
  7. - (void)viewDidLoad
  8. {
  9. [super viewDidLoad];
  10. // 获取FKBooksParser实例对象
  11. booksParser = [[FKBooksParser alloc] init];
  12. // 解析XML文档
  13. [booksParser readXml:@"books"];
  14. }
  15. - (NSInteger)tableView:(UITableView *)tableView
  16. numberOfRowsInSection:(NSInteger)section
  17. {
  18. // booksParser的books属性包含多少个元素,此处就显示多少个表格行。
  19. return booksParser.books.count;
  20. }
  21. - (UITableViewCell *)tableView:(UITableView *)tableView
  22. cellForRowAtIndexPath:(NSIndexPath *)indexPath
  23. {
  24. // 获取可重用的单元格
  25. UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:
  26. @"bookCell" forIndexPath:indexPath];
  27. // 从可重用单元格中根据Tag分别取出3个UILabel控件
  28. UILabel* titleLabel = (UILabel*)[cell viewWithTag:1];
  29. UILabel* authorLabel = (UILabel*)[cell viewWithTag:2];
  30. UILabel* remarkLabel = (UILabel*)[cell viewWithTag:3];
  31. FKBook* book = [booksParser.books objectAtIndex:indexPath.row];
  32. // 为3个UILabel设置文本
  33. titleLabel.text = book.title;
  34. authorLabel.text = book.author;
  35. remarkLabel.text = book.remark;
  36. NSLog(@"---%d" , book.bookID);
  37. return cell;
  38. }
  39. @end

3.NSXMLParser

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface FKXMLPraserDelegate : NSObject <NSXMLParserDelegate>
  4. // 定义一个NSMutableArray集合来保存解析XML文档得到的数据
  5. @property (nonatomic, strong) NSMutableArray *books;
  6. @end
  7.  
  8. #import "FKXMLPraserDelegate.h"
  9. #import "FKBook.h"
  10.  
  11. @implementation FKXMLPraserDelegate
  12. // 定义一个FKBook对象,用于保存正在解析的<book>元素中的数据
  13. FKBook* book;
  14. NSString* currentElementValue;
  15. // 当开始处理某个元素时触发该方法
  16. -(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  17. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
  18. attributes:(NSDictionary *)attributeDict
  19. {
  20.  
  21. NSLog(@"开始处理元素 %@" , elementName);
  22. if([elementName isEqualToString:@"books"])
  23. {
  24. // 如果正在处理根元素,在此处初始化存储解析结果的NSMutableArray集合
  25. self.books = [[NSMutableArray alloc] init];
  26. }
  27. // 如果正在处理<book.../>元素
  28. else if([elementName isEqualToString:@"book"])
  29. {
  30. // 初始化FKBook对象
  31. book = [[FKBook alloc] init];
  32. // 从attributeDict中读取<book.../>元素的属性id的值
  33. book.bookID = [[attributeDict objectForKey:@"id"] integerValue];
  34. }
  35. }
  36. // 当开始处理字符串内容时触发该方法
  37. -(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
  38. {
  39. NSLog(@"处理字符串内容:%@",string);
  40. // 如果当前的字符串值不为nil,保存当前正在处理的元素的值
  41. if(string)
  42. {
  43. currentElementValue = string;
  44. }
  45.  
  46. }
  47. // 当处理某个元素结束时触发该方法
  48. -(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  49. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
  50. {
  51. // 如果处理根元素结束,表明XML文档处理完成。
  52. if([elementName isEqualToString:@"books"])
  53. {
  54. return;
  55. }
  56. // 如果处理<book.../>元素结束,则将封装的FKBook对象添加到NSMutableArray集合中
  57. else if([elementName isEqualToString:@"book"])
  58. {
  59. [self.books addObject: book];
  60. book = nil;
  61. }
  62. else
  63. {
  64. // 如果既不是处理<books.../>元素,也不是处理<book.../>元素的时候,
  65. // 则使用KVC方式为当前FKBook对象的属性赋值
  66. [book setValue:currentElementValue forKey:elementName];
  67. currentElementValue = nil;
  68. }
  69. }
  70. @end

iOS开发XML解析的更多相关文章

  1. iOS开发 XML解析和下拉刷新,上拉加载更多

    iOS开发 XML解析和下拉刷新,上拉加载更多 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示 ...

  2. 2016 - 1- 23 iOS中xml解析 (!!!!!!!有坑要解决!!!!!!)

    一: iOS中xml解析的几种方式简介 1.官方原生 NSXMLParser :SAX方式解析,使用起来比较简单 2.第三方框架 libxml2 :纯C 同时支持DOM与SAX GDataXML: D ...

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

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

  4. iOS平台XML解析类库对比和安装说明

    在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...

  5. 【IOS】 XML解析和xml转plist文件(GDataXML)

    iOS对于XML的解析有系统自带的SDK--NSXMLParser,鄙人愚拙,只会用GDataXML进行解析,这里仅介绍GData的使用.(以下图为例) 1.对于一个xml文件,先读取出来 NSDat ...

  6. iOS - OC - XML 解析 - NSXMLParser

    //4.解析数据 //4.1 创建XML解析器:SAX NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; //4.2 设置代理 ...

  7. iOS开发——XML/JSON数据解析

    NSJSONSerialization 接下来就正式开始.苹果官方给出的解析方式是性能最优越的,虽然用起来稍显复杂. 首先我们在上面已经有了我希望得到的信息的网站的API给我们的URL,在OC中,我要 ...

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

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

  9. iOS开发-JSON解析

    JSON(JavaScript Object Notation)在网络传输中几乎无处不在,JSON是一种轻量级的数据交换格式,是基于JavaScript(Standard ECMA-262 3rd E ...

随机推荐

  1. bzoj2431逆序对数列——递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2431 考虑新加入一个数i,根据放的位置不同,可以产生0~i-1个新逆序对: 所以f[i][j ...

  2. Sublime Text3 python代码去除白色框框

    之所以会出现白色框框,是因为代码不符合PEP8规范!!! 可以装一个 AUTOPEP8 插件,然后按 Ctrl + Alt + r 就会自动帮你PEP8格式化,白色框框就会消失了... 这是原来的博文 ...

  3. ASP.NET Core:WebAppCoreAngular

    ylbtech-ASP.NET Core:WebAppCoreAngular 1.返回顶部 1. 2. 3. 4. 5. 6. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部   ...

  4. 伪元素 first-letter

    ::after, ::before, ::backdrop, ::first-letter,::first-line, ::selection(css3)是伪元素, :active, :focus,  ...

  5. python之路,day7-面向对象变成

    本篇内容: 面向对象.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法: #@staticmethod只是名义上归类管理,实际上跟类没什么关系 ...

  6. 用deamon打开ISO文件,提示命令行错误!!

    用deamon打开ISO文件,提示命令行错误!! 解决方法:(没有关联iso文件)重新卸载deamon,再重新安装,在关联iso文件处打对勾,安装完成后即可用

  7. B. Vanya and Books

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  8. thinkpad开机引导方式变成PCI LAN选项解决

    问题:开机的引导方式变成[PCI LAN],并且前面有一个小箭头,无法正常启动加载.在BIOS中重置调整启动顺序也无法解决.无法进入U盘启动盘 1.首先开机按F12进入BIOS,选择 APP Menu ...

  9. sprintf系列函数

    1 简介和功能 字符串格式化命令,主要功能是把格式化的数据写入某个字符串中.sprintf 是个变参函数. 把格式化的数据写入某个字符串缓冲区. 2 函数原型 int sprintf( char *b ...

  10. bzoj 4199: [Noi2015]品酒大会【后缀数组+单调栈+并查集】

    用SA求出height数组,然后发现每个height值都有一个贡献区间(因为点对之间要依次取min) 用单调栈处理出区间,第一问就做完了 然后用并查集维护每个点的贡献(?),从大到小枚举height, ...