用NSXML解析数据

此博文主要说的是用NSXML来解析数据。

我们来一个拿个接口实例来说一下: 

 http://www.oschina.net/action/api/tweet_list?uid=0&pageIndex=0&pageSize=20

这个是用ASIHttp发送以上的请求,请求数据。

-(void)getDataFromServer{

    NSString *urlStr = [NSString stringWithFormat:@"%@?uid=%d&pageIndex=%d&pageSize=%d",api_tweet_list,0,0,20];

    NSURL *url = [NSURL URLWithString:urlStr];

    NSLog(@"%@",url);

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

    [request setRequestMethod:@"get"];

    [request setDelegate:self];

    [request setDidFailSelector:@selector(getError:)];

    [request setDidFinishSelector:@selector(getDataOnlie:)];

    [request startAsynchronous];

}


这个一个网络请求地址,当网web Sevice发送这样的一个请求的时候返回的是这样的一个xml的数据:

<oschina>
<tweetCount> 500 </tweetCount>
<!-- 总动弹数 -->
<pagesize> 3 </pagesize>
<tweets>
<tweet>
<id> 1992631 </id>
<portrait>
http://static.oschina.net/uploads/user/284/569120_50.jpg?t=1353067742000
</portrait>
<author>
<![CDATA[ 光头程序员 ]]>
</author>
<authorid> 569120 </authorid>
<body>
<![CDATA[ 回头看看 以前写的代码 真实在 现在自己好懒哦 ]]>
</body>
<appclient> 1 </appclient>
<commentCount> 0 </commentCount>
<pubDate> 2013-05-13 15:59:11 </pubDate>
<imgSmall/>
<imgBig/>
</tweet>
</tweets>
<notice>
<atmeCount> 0 </atmeCount>
<msgCount> 0 </msgCount>
<reviewCount> 0 </reviewCount>
<newFansCount> 0 </newFansCount>
</notice>
</oschina>


上面的代码是connection的代理方法,很容易的看出来twitterData里就是我们取得的XML数据,就是我们后面要解析的东西。 [ self startTwitterParser] 这个方法被调用就是要正式的解析XML数据了,如下:

//开始对返回的 data进行解析 ——

然后就是难点了-如何解析出你想要的内容。

#pragma mark -

#pragma mark - XMLDelegate

- (void )parserDidStartDocument:(NSXMLParser *)parser

{

twitterDic = [[ NSMutableDictionary alloc] initWithCapacity: 2 ]; // 每一条信息都用字典来存;

parserObjects = [[NSMutableArrayalloc]initWithCapacity:2];

 //每一组信息都用数组来存,做后得到的数据就在这个数组中

}

首先是 - (void )parserDidStartDocument:(NSXMLParser *)parser

这个方法是解析的开始的方法,我在这一步做的就是初始化了数组和字典了---就是以后存储数据的容器。
接着就是第一步的解析:

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

    if ([elementName isEqualToString:@"tweet"])//找节点进行解析

    {

        NSMutableDictionary *newNode = [[NSMutableDictionaryalloc]initWithCapacity:0];

        [parserObjects addObject:newNode];

        twitterDic = newNode;

    }

    else

        if (twitterDic) {

            NSMutableString *string = [[NSMutableStringalloc]initWithCapacity:0];

            [twitterDic setObject:stringforKey:elementName];

            [string release];

            currentText = [[NSStringalloc]init];

            currentElementName = elementName;

        }

}

然后进入

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

这个是把非UTF-8的字符串解析出来了。如果UTF-8字符串也会执行但显示的的内容为空解析不出来内容。

有UTF8的汉字符串就会进入这个方法了

-(void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{

    currentText = [NSStringstringWithUTF8String:[CDATABlockbytes]];

//    NSLog(@"cData:%@",[NSString stringWithUTF8String:[CDATABlock bytes]]);    

}

下一步,就是加入到字典里了,调用这个回调函数。

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    if ([elementName isEqualToString:currentElementName]) {

        [twitterDic setObject:currentTextforKey:currentElementName];//把其他节点放在字典中

   }

}

我们就将一项数据保存起来了。

解析完成后调这个回调方法

-(void)parserDidEndDocument:(NSXMLParser *)parser{//得到的解析结果

     NSLog(@"解析出来的一共有%d,\n第一项是:%@",[parserObjects count],[parserObjectsobjectAtIndex:0]);

    NSLog(@"%@",[[parserObjectsobjectAtIndex:0]objectForKey:@"author"]);

    NSLog(@"%@",[[parserObjectsobjectAtIndex:0]objectForKey:@"body"]);

}

我们将结果打印出来看到如下

2013-05-13 15:59:37.855 XMLPractice[2524:11303] 解析出来的一共有20,

第一项是:{

    appclient = 1;

    author = "\U5149\U5934\U7a0b\U5e8f\U5458";

    authorid = 569120;

    body = "\U56de\U5934\U770b\U770b \U4ee5\U524d\U5199\U7684\U4ee3\U7801 \U771f\U5b9e\U5728 \U73b0\U5728\U81ea\U5df1\U597d\U61d2\U54e6";

    commentCount = 0;

    id = 1992631;

    imgBig = "";

    imgSmall = "";

    portrait = "http://static.oschina.net/uploads/user/284/569120_50.jpg?t=1353067742000";

    pubDate = "2013-05-13 15:59:11";

}

2013-05-13 15:59:37.855 XMLPractice[2524:11303] 光头程序员

2013-05-13 15:59:37.855 XMLPractice[2524:11303] 回头看看 以前写的代码 真实在 现在自己好懒哦

附上源码:http://download.csdn.net/detail/zjh467545737/5367969 (虽然里面有TBXML库但还没用到,准备再用TBXML解析对比一下)。

参考:http://www.cnblogs.com/lovecode/articles/2305840.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值