iOS开发中XML网络解析的基本步骤与实现方法
一、基本思路1、请求网络数据到本地
2、创建NSXMLParser对请求到的数据进行解析
3、设置代理方法并实现
4、主要涉及到6个NSXMLParserDelegate代理方法,分别是
// 解析开始
-(void)parserDidStartDocument:(NSXMLParser *)parser
// 解析出错
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
// 解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
// 1、开始解析某个节点
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
// 2、解析某个节点数值
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
// 3、结束某个节点解析
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
5、XML解析的原理是遍历xml文件,并对"<>"敏感,当读取到"<>"时即断定为某个节点的开始,读取到"</>"时即断定为某个节点的结束,但xml中的节点是嵌套的,因此哪个节点的开始为组数据的开始(即我们的对象单元),哪个节点为对象内容的读取,需要我们在代理方法进行判断并拼接赋值给对象相对应的成员变量
二、代码示例及相关注释说明
1、对象定义
SAUrl.h
#import <Foundation/Foundation.h>
@interface SAUrl : NSObject
@property (nonatomic, strong) NSString*loc;
@property (nonatomic, strong) NSString*lastmod;
@property (nonatomic, strong) NSString*changefreq;
@property (nonatomic, strong) NSString*priority;
@endSAUrl.m
#import "SAUrl.h"
@implementation SAUrl
@end2、xml解析关键代码
#pragma mrak 请求网络数据
- (void)requestData
{
// 创建url
NSString *string = @"http://www.yusian.com/sitemap.xml";
NSURL *url = ;
// 从url中加载数据到内存对象
NSData *data = ;
// 对加载到的数据进行XML解析
NSXMLParser *perser = [ initWithData:data];
perser.delegate = self;
;
}
#pragma mark 解析开始
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
// 开始解析,初始化相关变量
_tempStr = ;
_dataList = ;
NSLog(@"解析开始");
}
#pragma mark 解析出错
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"解析出错:%@", parseError.localizedDescription);
}
#pragma mark 解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
// 解析结束,打印数组中各对象的值进行检测
for (SAUrl *url in _dataList) {
NSLog(@"%@", url.loc);
}
NSLog(@"解析结束");
}
#pragma mark 1、开始解析某个节点
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// 找到对象的节点名称,如果解析结点为url,则为一组对象的开始,开始解析时创建对象
if () _url = [ init];
}
#pragma mark 2、解析某个节点数值
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// 节点内容中的值有可能分多次返回,因此需要拼接字符串
;
}
#pragma mark 3、结束某个节点解析
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// 某节点内容中的值取完后,简单处理(比如去掉拼接过种中带来的回车符)
NSString *result = ];
// 如果解析节点为loc,则在结束时将解析出来的内容赋值给对象的相对应成员变量,其他同理
if () _url.loc = result;
if () _url.lastmod = result;
if () _url.changefreq = result;
if () _url.priority = result;
// 如果解析节点为url,则该组节点解析完毕,将该对象存入数组中
if () ;
// 每次节点结束均需要清空中间变量的值,准备下一个节点值的接收
_tempStr.string = @"";
}
三、Demo下载:
**** Hidden Message *****
看一看,是什么
页:
[1]