在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=[[NSXMLParseralloc]initWithData:[xmldataUsingEncoding:NSUTF8StringEncoding]];
-
- NSXMLParser*parser=[[NSXMLParseralloc]initWithContentsOfURL:[NSURLURLWithString:@"http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml"]];
- [parsersetDelegate:self];
- [parsersetShouldProcessNamespaces:NO];
- [parserparse];
2、委托方法
主要使用一下委托方法:
- -(void)parser:(NSXMLParser*)parser
- didStartElement:(NSString*)elementName
- namespaceURI:(NSString*)namespaceURI
- qualifiedName:(NSString*)qName
- attributes:(NSDictionary*)attributeDict
-
-
- -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string
- //发现元素结束符的处理函数,保存元素各项目数据(即报告元素的结束标记)
- didEndElement:(NSString*)elementName
- //报告解析的结束
- -(void)parserDidEndDocument:(NSXMLParser*)parser
- //报告不可恢复的解析错误
- -(void)paser:parserErrorOccured
执行[parser parse]后会依序执行:
1、didStartElement
2、foundCharacters
3、didEndElement
示例如下:
-(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qNameattributes:(NSDictionary*)attributeDict{
- NSLog(@"xml_parserstart%@",elementName);
- if([elementNameisEqualToString:@"person"]){
- NSLog(@"xml_parserperson");
- if(personNameArrary==nil){
- personNameArrary=[[NSMutableArrayalloc]init];
- }
- }
- if(itemValue!=nil){
- itemValue=nil;
- itemValue=[[NSMutableStringalloc]init];
- if([elementNameisEqualToString:@"phone"]){
- NSString*atr=[attributeDictvalueForKey:@"type"];
- NSLog(@"xml_parserphonetype:%@",atr);
- -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string{
- NSLog(@"xml_parservalue:%@",string);
- [itemValueappendString:string];
- -(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName{
- NSLog(@"xml_parserend%@",elementName);
- if([elementNameisEqualToString:@"firstName"]){
- [personNameArraryaddObject:itemValue];
- if([elementNameisEqualToString:@"person"]){
- NSLog(@"xml_parserpersonend");
- }
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|