做过ios开发的朋友都知道,目前在ios开发中,和服务端交互时,主要是使用xml和json两种解析方式。今天阿堂介绍的是xml的解析方式的实例,对于json解析方式,我会在后面继续分享。
下面,阿堂对于xml的解析框架,首先先做个简单介绍。
ios sdk 提供了两个xml框架。
1)nsxml:它是基于objective-c语言的sax解析框架,是ios
sdk默认的xml解析框架,不支持dom模式。
2)libxml2: 它是基于c语言的xml解析器,被苹果整合在ios sdk中,支持sax和dom模式。
第三方xml解析框架
1)tbxml:它是轻量级的dom模式解析库,不支持xml文档验证和xpath,只能读取xml文档,不能写xml文档,但是解析xml是最快的。
2)touchxml:它是基于dom模式的解析库,与 tbxml类似,只能读取xml文档,不能写xml文档。
3)kissxml:它是基于dom模式的解析库,基于touchxml,主要的不同是可以写入xml文档。
4)tinyxml:它是基于c++语言模式解析库,可以读写xml文档,不支持xpath.
5)gdataxml:它是基于dom模式的解析库,由google开发,可以读写xml文档,支持xpath查询。
从性能上来看,nsxml和tbxml比较优秀,所以阿堂就主要介绍这两个xml解析器了
一. nsxml解析实例demo
1. Notes.xml
![IOS开发系列之xml解析阿堂教程(1) IOS开发系列之xml解析阿堂教程(1)](http://image80.360doc.com/DownloadImg/2014/12/2017/48267221_1)
2.使用nsxml
nsxml是ios
sdk自带的,也是苹果默认的解析框架,它采用sax模式解析,是sax解析模式的代表。nsxml框架的核心是nsxmlparser和它的委托协议nsxmlparserdelegate,其中主要的解析工作是在nsxmlparserdelegate实现类中完成的。委托中定义了很多回调方法,在sax解析器从上到下遍历xml文档的过程中,遇到开始标签,结束标签,文档开始和字符串时就会触发这些方法。这些方法比较多,下面我们列出几个常用的方法
--parserDidStartDocument:
--parser:didStartElement:namespaceURI:qualifiedName:attributes:
--parser:foundCharacters:
--parser:didEndElement:namespaceURI:qualifiedName:
--parserDidEndDocument:
专门的解析类
NotesXMLParser.h, NotesXMLParser.m
NotesXMLParser.h
#import
@interface NotesXMLParser : NSObject
//解析出的数据内部是字典类型
@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;
NSLog(@"_currentTagName = %@",_currentTagName);
if
([_currentTagName isEqualToString:@"Note"]) {
NSString *_id = [attributeDict objectForKey:@"id"];
NSLog(@"note对应的属性id = %@",_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
compare:@""] == NSOrderedDescending) {
NSLog(@"字符串 = %@",string);
}
if ([string
isEqualToString:@""]) {
return;
}
NSMutableDictionary *dict = [_notes lastObject];
if
([_currentTagName isEqualToString:@"CDate"] && dict)
{
|