XML解析(转)
非原创,转载自http://my.oschina.net/khakiloveyty/blog/396671
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
XML解析(转)的更多相关文章
- xml解析技术
本文总结Dom,sax解析, 使用Java作为工具解析xml文档. 1 Dom 综述:Dom解析xml通常也称为xmlDom (和htmlDom技术差不多),将xml文档封装成树,好处就是xml中的 ...
- Duilib源码分析(三)XML解析器—CMarkup
上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...
- JSON解析和XML解析对比
JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...
- 【Android】实现XML解析的几种技术
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
- 定位和xml解析和gson解析加上拉加载,下拉刷新
这里的上拉加载,下拉刷新用到是依赖包 Mainactivity,xml解析和定位 package com.exmple.autolayout; import java.util.List; impor ...
- tinyxml一个优秀的C++ XML解析器
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...
- PERL/LEX/YACC技术实现文本解析--XML解析
继周六的p_enum.pl后,再来一篇说说我用perl做的lex,yacc工具.之前说了,我学习lex和yacc的最初动机是为了做个C语言解释器的SHELL:但后来工作中的实际需要也是制作perl版l ...
- 基本XML解析---编写
#import "ViewController.h" #import "DDXML.h" @interface ViewController () @end @ ...
- iOS-数据解析XML解析的多种平台介绍
在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...
- XML解析之DOM详解及与SAX解析方法的比较
XML解析(DOM) XML文件解析方法介绍 我们所用到的NSXMLParser是采用SAX方法解析 SAX(Simple API for XML) 只能读,不能修改,只能顺序访问,适合解析大型XML ...
随机推荐
- ashx文件的使用
转自:http://www.cnblogs.com/Tally/archive/2013/02/19/2916499.html ashx是什么文件 .ashx 文件用于写web handler的..a ...
- android学习——必学基础组件
android基础组件是一个Android的开发人员必须要了解,且深刻理解的东西: 1.应用程序基础 2.应用程序组件 2.1.活动(Activities) 2.2.服务(Services) 2.3. ...
- sql递归函数(自定义函数递归查找) 能返回递归的层次
实现效果图如下: 创建表: create table t_tree ( id int IDENTITY(1,1), parentid int, name varchar(10) ) go 插入测试数据 ...
- suse系统卸载数据库实例
1.停止数据库: 2.执行以下命令: find $ORACLE_BASE/* -name '*[Tt][Ee][Ss][Tt]*' 其中TEST为数据库的实例名: 删除存在的文件: 3.删除/etc ...
- ADB对手机进行开关机测试
Verify issue 时,其中有条要对手机进行开关机100次,由于只有ADB环境,只能用批处理来写脚本了,代码如下: ::需配置ADB环境,开启Debug模式 ::start循环 :start s ...
- python 零散记录(七)(上) 面向对象 类 类的私有化
python面向对象的三大特性: 多态,封装,继承 多态: 在不知道对象到底是什么类型.又想对其做一些操作时,就会用到多态 如 'abc'.count('a') #对字符串使用count函数返回a的数 ...
- Javascript数据类型——number类型
ECMAScript规范中使用IEEE754格式来表示整数和浮点数.支持十进制.八进制以及十六进制.有一点注意的是八进制数字在严格模式下是无效的,这可能会影响到程序的正常运行. 避免浮 ...
- redhat开启linux server
1.redhat linux5 enterprize 默认情况下是没有安装telnet server,可以使用rpm -q telnet查询,下图是安装后的查询结果
- 关于PHP程序员解决问题的能力
这个话题老生长谈了,在面试中必然考核的能力中,我个人认为解决问题能力是排第一位的,比学习能力优先级更高.解决问题的能力既能看出程序员的思维能力,应变能力,探索能力等,又可以看出他的经验.如果解决问题能 ...
- MVC 音乐商店 第 9 部分: 注册和结帐
MVC 音乐商店是介绍,并分步说明了如何使用 ASP.NET MVC 和 Visual Studio 为 web 开发教程应用程序. MVC 音乐商店是一个轻量级的示例存储实现它卖音乐专辑在线,并实现 ...