(九)—— xml数据解析

最后更新于:2022-04-01 07:05:09

在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 ~~~ 执行[parser parse]后会依序执行: 1、didStartElement 2、foundCharacters 3、didEndElement 示例如下: ~~~ -(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"); } } ~~~
';