iOS学习笔记(九)——xml数据解析 (转)

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

 

  1. NSXMLParser *parser=[[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]]; 
  2.   
  3.    NSXMLParser *parser=[[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml"]]; 
  4.   
  5. [parser setDelegate:self];//设置NSXMLParser对象的解析方法代理 
  6. [parser setShouldProcessNamespaces:NO]; 
  7. [parser parse];//开始解析 
 

2、委托方法

 

主要使用一下委托方法:

 

  1. //发现元素开始符的处理函数  (即报告元素的开始以及元素的属性)  
  2. - (void)parser:(NSXMLParser *)parser  
  3.         didStartElement:(NSString *)elementName  
  4.         namespaceURI:(NSString *)namespaceURI  
  5.         qualifiedName:(NSString *)qName  
  6.         attributes:(NSDictionary *)attributeDict 
  7.  
  8. //处理标签包含内容字符 (报告元素的所有或部分内容)  
  9. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
  10.  
  11. //发现元素结束符的处理函数,保存元素各项目数据(即报告元素的结束标记) 
  12. - (void)parser:(NSXMLParser *)parser  
  13.         didEndElement:(NSString *)elementName  
  14.         namespaceURI:(NSString *)namespaceURI  
  15.         qualifiedName:(NSString *)qName 
  16.  
  17. //报告解析的结束  
  18. - (void)parserDidEndDocument:(NSXMLParser *)parser 
  19.  
  20. //报告不可恢复的解析错误 
  21. - (void)paser:parserErrorOccured 

 

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

1、didStartElement

2、foundCharacters

3、didEndElement

示例如下:

 

  1. -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
  2.      
  3.     NSLog(@"xml_parser start %@ ",elementName); 
  4.     if ( [elementName isEqualToString:@"person"] ) { 
  5.         NSLog(@"xml_parser person "); 
  6.         if(personNameArrary==nil){ 
  7.             personNameArrary=[[NSMutableArray alloc] init]; 
  8.         } 
  9.     } 
  10.  
  11.         if(itemValue!=nil){ 
  12.             itemValue=nil; 
  13.         } 
  14.         itemValue=[[NSMutableString alloc] init]; 
  15.      
  16.     if ( [elementName isEqualToString:@"phone"] ) {   
  17.         NSString *atr=[attributeDict valueForKey:@"type"]; 
  18.         NSLog(@"xml_parser phone type: %@",atr); 
  19.     } 
  20.  
  21. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
  22.      
  23.     NSLog(@"xml_parser value:%@",string); 
  24.     [itemValue appendString:string]; 
  25.  
  26. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
  27.  
  28.     NSLog(@"xml_parser end %@ ",elementName); 
  29.     if ( [elementName isEqualToString:@"firstName"] ) { 
  30.         [personNameArrary addObject:itemValue]; 
  31.     } 
  32.      
  33.     if ( [elementName isEqualToString:@"person"] ) { 
  34.         NSLog(@"xml_parser person end"); 
  35.     } 
  36.      
posted @ 2013-09-03 13:00  李小见  阅读(208)  评论(0编辑  收藏  举报