在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。这篇文章使用了NSXMLParser。
解析 XML 通常有两种方式,DOM 和 SAX:
- DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
- SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。
NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。
1、初始化NSXMLParser
要使用NSXMLParser要先创建它,设置各种属性,主要用到以下几个方法:
initWithContentsOfURL 通过NSURL创建解析器
initWithData 通过NSData创建解析器
setDelegate 为解析器定义委托
parse 运行解析器
- NSXMLParser *parser=[[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]];
- NSXMLParser *parser=[[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml"]];
- [parser setDelegate:self];//设置NSXMLParser对象的解析方法代理
- [parser setShouldProcessNamespaces:NO];
- [parser parse];//开始解析
2、委托方法
主要使用一下委托方法:
- //发现元素开始符的处理函数 (即报告元素的开始以及元素的属性)
- - (void)parser:(NSXMLParser *)parser
- didStartElement:(NSString *)elementName
- namespaceURI:(NSString *)namespaceURI
- qualifiedName:(NSString *)qName
- attributes:(NSDictionary *)attributeDict
- //处理标签包含内容字符 (报告元素的所有或部分内容)
- - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
- //发现元素结束符的处理函数,保存元素各项目数据(即报告元素的结束标记)
- - (void)parser:(NSXMLParser *)parser
- didEndElement:(NSString *)elementName
- namespaceURI:(NSString *)namespaceURI
- qualifiedName:(NSString *)qName
- //报告解析的结束
- - (void)parserDidEndDocument:(NSXMLParser *)parser
- //报告不可恢复的解析错误
- - (void)paser:parserErrorOccured
// xml文件的样式 的样式有多种样式,标准的是把数据存放在子节点中,还有就是比较简单的读取就是把数据直接存在属性里面
#import
@interface RootViewController : UIViewController<</span>NSXMLParserDelegate>
#pragma mark - 声明--属性
@property (nonatomic, retain) NSMutableArray *messageeListArray; // 数据存储的地方
@property (nonatomic, retain) NSString *fromTagFlag; // 开始标签
@end
#import "RootViewController.h"
@interface RootViewController ()
@end
@implementation RootViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
}
- (void)viewDidLoad
{
}
#pragma mark - NSXMLParser Delegate -
#pragma mark 文档开始读取
- (void)parserDidStartDocument:(NSXMLParser *)parser {
}
#pragma mark 解析标签开始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
}
#pragma mark 获取到标签对应的数据
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
}
#pragma mark - 解析标签结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
}
#pragma mark 文档结束读取
- (void)parserDidEndDocument:(NSXMLParser *)parser {
}
#pragma mark - 重写----dealloc方法
- (void)dealloc {
}
@end
#import
@interface RootViewController : UIViewController<</span>NSXMLParserDelegate>
#pragma mark - 声明--属性
@property (nonatomic, retain) NSMutableArray *messageeListArray; // 数据存储的地方
@property (nonatomic, retain) NSString *fromTagFlag; // 开始标签
@end
#import "RootViewController.h"
@interface RootViewController ()
@end
@implementation RootViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
}
- (void)viewDidLoad
{
}
#pragma mark - NSXMLParser Delegate -
#pragma mark 文档开始读取
- (void)parserDidStartDocument:(NSXMLParser *)parser {
}
#pragma mark 解析标签开始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
}
#pragma mark 获取到标签对应的数据
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
}
#pragma mark - 解析标签结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
}
#pragma mark 文档结束读取
- (void)parserDidEndDocument:(NSXMLParser *)parser {
}
#pragma mark - 重写----dealloc方法
- (void)dealloc {
}
@end