您的位置:首页 > 移动开发 > IOS开发

iOS学习笔记—— xml数据解析

2015-09-14 11:26 633 查看
/article/1351084.html

在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 运行解析器

[cpp] view
plaincopyprint?

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、委托方法

主要使用一下委托方法:

[cpp] view
plaincopyprint?

//发现元素开始符的处理函数 (即报告元素的开始以及元素的属性)

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

执行[parser parse]后会依序执行:

1、didStartElement

2、foundCharacters

3、didEndElement

示例如下:

[cpp] view
plaincopyprint?

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

NSLog(@"xml_parser start %@ ",elementName);

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

NSLog(@"xml_parser person ");

if(personNameArrary==nil){

personNameArrary=[[NSMutableArray alloc] init];

}

}

if(itemValue!=nil){

itemValue=nil;

}

itemValue=[[NSMutableString alloc] init];

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

NSString *atr=[attributeDict valueForKey:@"type"];

NSLog(@"xml_parser phone type: %@",atr);

}

}

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

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

[itemValue appendString:string];

}

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

NSLog(@"xml_parser end %@ ",elementName);

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

[personNameArrary addObject:itemValue];

}

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

NSLog(@"xml_parser person end");

}

}

NSXMLParser DEMO 下载

参考:
http://www.cnblogs.com/dotey/archive/2011/05/11/2042000.html https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/XMLParsing/Articles/HandlingElements.html#//apple_ref/doc/uid/20002265-BCIJFGJI http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: