解析不是utf-8的xml文件 附(tag 属性的获取 )


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

如果url中有中文:

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


gbk编码的xml文件:

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模式

1:打开一个xml文件,读取内容到NSData中

2:调用NSXMLParse的InitWithData方法,并设置代理tweetParser.delegate = self;

3:调用回调函数

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

 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//打开文件失败



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

//开始解析前,可以做一些初始话的工作   
- (void)parserDidStartDocument:(NSXMLParser *)parser {
}

 

//解析到一个开始tag,开始tag中可能会有properpies,例如<book catalog="Programming">   
//所有的属性都储存在attributeDict中
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
    {    
if ([elementName isEqual:@"book"]) 
        {    
NSString *catalog = [attributeDict objectForKey:@"catalog"];
}
else if([bookTags containsObject:elementName])
       {           
}
}

 

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

//处理到一个结束tag
- (void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName {
}


//xml解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser {
}

 

//例子,这里要特别注意的是dataWithContentsOfFile后面一定要根绝对路径,而NSBundle能根据文件名来得到这个绝对路径。   
-(void) testXMLParse{
NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"test.xml" ofType:nil inDirectory:nil];

NSData *fileData = [NSData dataWithContentsOfFile:xmlPath];

NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:fileData];
[xmlParser setDelegate:self];
BOOL result = [xmlParser parse];
if (!result) {
NSLog(@"The error is %@", [xmlParser parserError]);
}
//[xmlParser release];
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值