Sian 发表于 2014-11-7 02:22:32

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 *****

活在梦里丶 发表于 2015-6-26 12:12:43

看一看,是什么
页: [1]
查看完整版本: iOS开发中XML网络解析的基本步骤与实现方法