iOS中的XML处理

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

如果url中有中文:

[cpp:nogutter]  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文件:

  1. NSString *xmlStr = [[NSString alloc] initWithData:inData encoding:0×80000632];
  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必须要顶格写!

  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的提示,但是实行是没有问题的。

//开始解析前,可以做一些初始话的工作

  1. - (void)parserDidStartDocument:(NSXMLParser *)parser {
  2. }

//解析到一个开始tag,开始tag中可能会有properpies,例如<book catalog=”Programming”>
//所有的属性都储存在attributeDict中

  1. - (void)parser:(NSXMLParser *)parser
  2.         didStartElement:(NSString *)elementName
  3.         namespaceURI:(NSString *)namespaceURI
  4.         qualifiedName:(NSString *)qualifiedName
  5.         attributes:(NSDictionary *)attributeDict {
  6.     if ([elementName isEqual:@"book"]) {
  7.         NSString *catalog =  [attributeDict objectForKey:@"catalog"];
  8.     }
  9.     else if([bookTags containsObject:elementName]){
  10.     }
  11. }

//这时处理例如<title lang=”en”>C++ Programming Language</title>的情况

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

//处理到一个结束tag

  1. - (void)parser:(NSXMLParser *)parser
  2.         didEndElement:(NSString *)elementName
  3.         namespaceURI:(NSString *)namespaceURI
  4.         qualifiedName:(NSString *)qName {
  5. }

//xml解析结束

  1. - (void)parserDidEndDocument:(NSXMLParser *)parser {
  2. }

//例子,这里要特别注意的是dataWithContentsOfFile后面一定要根绝对路径,而NSBundle能根据文件名来得到这个绝对路径。

  1. -(void) testXMLParse{
  2.     NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@”test.xml” ofType:nil inDirectory:nil];
  3.     NSData *fileData = [NSData dataWithContentsOfFile:xmlPath];
  4.     NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:fileData];
  5.     [xmlParser setDelegate:self];
  6.     BOOL result = [xmlParser parse];
  7.     if (!result) {
  8.         NSLog(@”The error is %@”, [xmlParser parserError]);
  9.     }
  10.     //[xmlParser release];
  11. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值