IOS 对XML的处理

解析不是utf-8的xml文件(尤其是中文网站的rss文件):

如果url中有中文:

[cpp]  view plain copy
  1. const char *str = [searchURL UTF8String];  
  2. NSString *url = [NSString stringWithUTF8String:str];  
  3. url = [url stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];  
  4. NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];  
 

 

gbk编码的xml文件:

[cpp]  view plain copy
  1. NSString *xmlStr = [[NSString alloc] initWithData:inData encoding:0x80000632];  
  2. NSString *newXMLStr = [xmlStr stringByReplacingOccurrencesOfString:@"encoding=/"gbk/"" withString:@"encoding=/"UTF-8/""];  
  3. NSXMLParser *nextParser = [[NSXMLParser alloc] initWithData:[newXMLStr dataUsingEncoding:NSUTF8StringEncoding]];  
 

 

在iOS中解析XML

  • 以读文件的形式

iOS中的XML是event-driven模式

step-1:打开一个xml文件,读取内容到NSData中 
          2:调用NSXMLParse的nitWithData方法,并设置代理tweetParser.delegate = self; 
          3:调用回调函数 

注意:xml文件的第一个tag必须要顶格写! 

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <bookstore>  
  3.       <book catalog="Programming">  
  4.           <title lang="en">C++ Programming Language</title>  
  5.           <author>Bjarne Stroustrup</author>  
  6.           <year>1998</year>  
  7.           <price>98.0</price>  
  8.       </book>  
  9.     <book catalog="Networking">  
  10.           <title lang="en">TCP/IP Illustrated</title>  
  11.           <author>Richard Stevens</author>  
  12.           <year>1996</year>  
  13.           <price>56.0</price>  
  14.     </book>  
  15. </bookstore>  


可以[NSXMLParser parserError]调用来得到错误的信息: 
NSXMLParserErrorDomain error 4:  xml文件格式有问题(如上面) 
NSXMLParserErrorDomain error 5:  打开文件失败 

在iOS4.1中如果不显示实现NSXMLParseDelegate的话会有一条warning的提示,但是实行是没有问题的。 

//开始解析前,可以做一些初始话的工作 
[cpp]  view plain copy
  1. - (void)parserDidStartDocument:(NSXMLParser *)parser {  
  2. }  


//解析到一个开始tag,开始tag中可能会有properpies,例如<book catalog="Programming"> 
//所有的属性都储存在attributeDict中 
[cpp]  view plain copy
  1. - (void)parser:(NSXMLParser *)parser  
  2.         didStartElement:(NSString *)elementName  
  3.         namespaceURI:(NSString *)namespaceURI  
  4.         qualifiedName:(NSString *)qualifiedName  
  5.         attributes:(NSDictionary *)attributeDict {  
  6.      
  7.     if ([elementName isEqual:@"book"]) {  
  8.         NSString *catalog =  [attributeDict objectForKey:@"catalog"];  
  9.     }  
  10.     else if([bookTags containsObject:elementName]){         
  11.     }  
  12. }  


//这时处理例如<title lang="en">C++ Programming Language</title>的情况 
[cpp]  view plain copy
  1. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {  
  2. }  


//处理到一个结束tag 
[cpp]  view plain copy
  1. - (void)parser:(NSXMLParser *)parser  
  2.         didEndElement:(NSString *)elementName  
  3.         namespaceURI:(NSString *)namespaceURI  
  4.         qualifiedName:(NSString *)qName {  
  5. }  


//xml解析结束 
[cpp]  view plain copy
  1. - (void)parserDidEndDocument:(NSXMLParser *)parser {  
  2. }  



//例子,这里要特别注意的是dataWithContentsOfFile后面一定要根绝对路径,而NSBundle能根据文件名来得到这个绝对路径。 
[cpp]  view plain copy
  1. -(void) testXMLParse{  
  2.     NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"test.xml" ofType:nil inDirectory:nil];  
  3.      
  4.     NSData *fileData = [NSData dataWithContentsOfFile:xmlPath];  
  5.      
  6.     NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:fileData];  
  7.     [xmlParser setDelegate:self];  
  8.     BOOL result = [xmlParser parse];  
  9.     if (!result) {  
  10.         NSLog(@"The error is %@", [xmlParser parserError]);  
  11.     }  
  12.     //[xmlParser release];  
  13. }  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值