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

时间: 2024-12-06 23:04:17

iOS开发之解析XML的相关文章

iOS开发之解析XML格式数据

XML格式的数据是一种数据的传输格式.因为它方便编写.结构清晰,所以深受程序猿的喜爱,非常多人都喜欢使用XML格式数据传输或者作为程序的配置信息. 如今我将来实如今iOS中解析XML格式数据,语言使用Swift. 首先自己写一个简单的XML: <data> <person age="15">zhangsan</person> <person age="2">lisi</person> <person&

iOS多线程与网络开发之解析xml

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 A.XML基本知识 1.xml概念 什么是XML全称是Extensible Markup Lan

iOS开发网络篇—XML数据的解析

iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document) XML举例 <videos> <video name="小黄人 第01部" length="30" /> <video name="小黄人 第02部&qu

IOS开发网络篇—XML介绍

iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document) XML举例 <videos> <video name="小黄人 第01部" length="30" /> <video name="小黄人 第02部" length="1

iOS开发-简单解析JSON数据

什么是JSON ? JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) ? JSON的格式很像OC中的字典和数组 ? {"name" : "Jack", "age" : 10} {"name" : ["jack", "rose", "jim"]} ? 标准JSON格式的注意点: key必须用双

iOS开发- 生成/解析.vcf文件

vcf, 通讯录导出的一种格式. 一.生成vcf文件 如果要把我们iPhone通讯录里的数据, 生成vcf格式文件. 我们可以借助iCloud. 小技巧:通过iCloud导出iPhone通讯录的方法 当然, 如果你想在应用中, 利用代码生成, 完全可以.先导出通讯录数据, 再解析, 再生成vcf文件即可. 参考下面代码: -(NSString*)generateVCardStringWithContacts:(CFArrayRef)contacts { NSInteger counter = 0

Android开发之解析XML并实现三级联动效果

请尊重他人的劳动成果,转载请注明出处:Android开发之解析XML并实现三级联动效果 本实例主要应用XmlPullParser解析XML文档中的省市区,然后将数据绑定到Spinner上实现三级联动的效果.关于XmlPullParser的详解大家可以参考<Android开发之使用PULL解析和生成XML>一文. 运行效果图: 程序代码: 核心代码: <pre name="code" class="java">package com.jph.s

Android开发pool解析xml

xml在开发中的作用不可小觑,很多时候我们都要用到这种文件,所以学习它的解析方式很是必要. 我们都知道java中xml的解析有:dom,SAX,但是Android下我们使用pool解析,是更为方便,而且有专门的api可以使用. dom:一次加载到内存,生成一个树状结构,消耗的内存较大 SAX:基于事件,速度快,效率高,不能回退. 1,首先我们需要定义出来解析器,它的定义方式,是通过Xml new出来的,这点要记着. XmlPullParser parser = Xml.newPullParser

微信公众号开发之解析xml数据包

在上次开发的基础上(链接在这里:https://www.cnblogs.com/segho/p/11654719.html) 我们来对用户发送过来的消息进行解析: 需要用到dom4j.jar,自行百度下载资源 我们将xml文件解析文map键值对, 将其直观的反映在console控制台上 WxService中的parseRequest方法代码如下: 1 public static Map<String, String> parseRequest(InputStream is) { 2 Map&l