IOS 解析XML--使用NSXML
2015-10-06 18:43
309 查看
一、解析文档顺序触发的函数
1.parserDidStartDocument,在文档的时候触发。
2.parser:didStartElement:namespaceURI:qualifiedName:attributes,遇到一个开始标签时触发,其中namespaceURI部分是命名空间,qualifiedName是限定名,attributes是字典类型的属性集合。
3.parser:foundCharacters,遇到字符串是触发。
4.parser:didEndElement:namespaceURI:qualifiedName,遇到结束标签时触发。
5.parserDidEndDocument,遇到文档结束时触发。
二、NSXMLParser是解析类,它有3个构造方法
1.initWithContentsOfURL,可以使用URL对象创建解析对象,本例中采用的是该方法,先从资源文件中加载获得URL对象,再使用URL对象构建解析对象。
2.initWithData,可以使用NSData创建解析对象。
3.initWithStream,可以使用IO流对象创建解析对象。
解析对象创建好后需要指定委托属性对象delegate为self,然后发送parse消息,开始解析文档。
三、代码
NotesXMLParser.h
NotesXMLParser.m
1.parserDidStartDocument,在文档的时候触发。
2.parser:didStartElement:namespaceURI:qualifiedName:attributes,遇到一个开始标签时触发,其中namespaceURI部分是命名空间,qualifiedName是限定名,attributes是字典类型的属性集合。
3.parser:foundCharacters,遇到字符串是触发。
4.parser:didEndElement:namespaceURI:qualifiedName,遇到结束标签时触发。
5.parserDidEndDocument,遇到文档结束时触发。
二、NSXMLParser是解析类,它有3个构造方法
1.initWithContentsOfURL,可以使用URL对象创建解析对象,本例中采用的是该方法,先从资源文件中加载获得URL对象,再使用URL对象构建解析对象。
2.initWithData,可以使用NSData创建解析对象。
3.initWithStream,可以使用IO流对象创建解析对象。
解析对象创建好后需要指定委托属性对象delegate为self,然后发送parse消息,开始解析文档。
三、代码
NotesXMLParser.h
#import <Foundation/Foundation.h> @interface NotesXMLParser : NSObject <NSXMLParserDelegate> //解析出的数据内部是字典类型 @property (strong,nonatomic) NSMutableArray *notes; //当前标签的名字 @property (strong,nonatomic) NSString *currentTagName; //开始解析 -(void)start; @end
NotesXMLParser.m
#import "NotesXMLParser.h" @implementation NotesXMLParser -(void)start { NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"xml"]; NSURL *url = [NSURL fileURLWithPath:path]; //开始解析XML NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; parser.delegate = self; [parser parse]; NSLog(@"解析完成..."); } //文档开始的时候触发 - (void)parserDidStartDocument:(NSXMLParser *)parser { _notes = [NSMutableArray new]; } //文档出错的时候触发 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSLog(@"%@",parseError); } //遇到一个开始标签时候触发 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { _currentTagName = elementName; if ([_currentTagName isEqualToString:@"Note"]) { NSString *_id = [attributeDict objectForKey:@"id"]; NSMutableDictionary *dict = [NSMutableDictionary new]; [dict setObject:_id forKey:@"id"]; [_notes addObject:dict]; } } //遇到字符串时候触发 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { //替换回车符和空格 string =[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; if ([string isEqualToString:@""]) { return; } NSMutableDictionary *dict = [_notes lastObject]; if ([_currentTagName isEqualToString:@"CDate"] && dict) { [dict setObject:string forKey:@"CDate"]; } if ([_currentTagName isEqualToString:@"Content"] && dict) { [dict setObject:string forKey:@"Content"]; } if ([_currentTagName isEqualToString:@"UserID"] && dict) { [dict setObject:string forKey:@"UserID"]; } } //遇到结束标签时候出发 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName; { self.currentTagName = nil; } //遇到文档结束时候触发 - (void)parserDidEndDocument:(NSXMLParser *)parser { [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil]; self.notes = nil; } @end
相关文章推荐
- iOS:多线程同步加锁的简单介绍
- IOS 高德地图
- iOS 代理传值
- IOS 提交审核,Missing Push Notification Entitlement
- ios图片压缩
- iOS之 LLDB调试常用命令
- ios 本地通知
- iOS中的定时器
- iOS 使用MJRefresh刷新
- iOS中的(null) <null> nil 问题
- 关于ios9中得ALAssetsLibrary框架过时问题
- iOS开发小项目之找色块游戏
- 关于ios8中CMStepCounter过时的问题
- 升级IOS9错误解决方案:Unexpected CFBundleExecutable Key.The bundle atXXXX
- iOS开发之 简易随机点名册的设计
- ios程序后台运行时,当有消息推送过来,如何修改程序角标上是数字
- iOS 自制汤姆猫
- iOS软件开发 如何做一个选择器
- 关于iOS9适配中出现的问题
- iOS中的动画总体预览