XML文档解析

2016-09-28  本文已影响5人  随风飘荡的小逗逼

第一种解析方式:SAX

因为这种解析方式是采用协议回调机制,逐行解析,所以苹果提供了一个类,这个类中封装了解析的整个过程,可以通过调用这个类中声明的协议方法来实现SAX解析的每个步骤。

第一步:获取需要解析文件的路径,用这个路径,初始化一个NSData或者NSURL对象,并用初始化好的对象创建一个解析NSXMLParser对象,同时设置执行协议的代理,设置好代理后用“parser”方法开始解析,这样才能按照逻辑执行协议中的方法,进行:开始标签——>取值并赋值——>结束标签——>取值。

- (void)setUpDataXMLParser

{

// 3. 创建路径

NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"];

// 2. NSData存储数据,以二进制形式存储

NSData *data = [NSDatadataWithContentsOfFile:path];

// 1. 创建一个分析人 类

NSXMLParser *parser = [[NSXMLParseralloc]initWithData:data];

// 设置代理

parser.delegate = self;

// 开始分析(利用协议方法,进行分析,去遵守协议NSXMLParserDelegate)

[parser parse];

// 释放分析人

[parser release];

NSLog(@"我在这里释放行吗?");

}

/**

*  执行顺序:

1. 开始分析: [parser parse];

// 开始代理方法的实现

1. 开始分析文件

2. 开始遇到节点

3. 发现字符

4. 结束遇到节点

5. 结束分析文件

*/

/***************************************************************/

/**

* 把XML数据保存到model需要的操作

1. 把数据取出来

2. 装进model

3. 把model装进数组,备用

1. 从什么位置初始化数组:开始分析文件位置

2. 从什么位置初始化model:开始遇到节点

// 从什么位置可以拿出数据: 4.发现字符

3. 从什么位置给model赋值:   5.结束节点

4. 从什么位置可以打印出数组: 已经结束分析文件(最后执行)

*/

第二步:

#pragma mark - NSXMLParser代理方法

// 1. 已经开始分析文件 (最先执行),这个方法值只走一次

// 在这个方法里面初始化数组

- (void)parserDidStartDocument:(NSXMLParser*)parser

{

// 初始化数组

self.dataArray= [NSMutableArrayarray];

NSLog(@"已经开始分析文件");

}

// 2. 已经结束分析文件 (最后执行)

//

- (void)parserDidEndDocument:(NSXMLParser*)parser

{

NSLog(@"已经结束分析文件");

NSLog(@"%@",self.dataArray);

}

// 3. 开始遇到节点

// 初始化model

- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary*)attributeDict

{

// 初始化model

// Student 是内层的节点, // self.model 这个model是在本类中声明的

if ([elementName isEqualToString:@"Student"]) {

self.model= [[StudentModelalloc]init];

}

//NSLog(@"开始遇到节点");

NSLog(@"<%@>", elementName);//节点名字

}

// 4. 发现字符, 逐行发现

// 拿出数据

- (void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string

{

// 保存字符串 , self.string也是被类声明的 nsstring类型的

self.string= string;// string就是<>之间的内容

//    NSLog(@"发现字符");

NSLog(@"string: %@", string);

}

// 5. 结束节点

// 给model赋值

- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName

{

// 给model赋值

if ([elementNameisEqualToString:@"name"]) {//如果节点的名字等于

self.model.name=self.string;

} else if ([elementName isEqualToString:@"gender"]) {

self.model.gender=self.string;

} else if ([elementName isEqualToString:@"age"]) {

self.model.age=self.string;

} else if ([elementName isEqualToString:@"motto"]) {

self.model.motto=self.string;

} else if ([elementName isEqualToString:@"Student"]) {

// 节点等于Student的时候一个model就赋值完成了,可以装进数组了

[self.dataArrayaddObject:self.model];

[_model release]; //装进数组后就可以释放了

}

//NSLog(@"遇到节点结束触发");

NSLog(@"", elementName);

}

上一篇 下一篇

猜你喜欢

热点阅读