zoukankan      html  css  js  c++  java
  • 【引用】iphone xml解析流程

    【引用】iphone xml解析流程  

    2011-05-06 15:09:35|  分类: 解析 |  标签: |字号 订阅

    本文引用自J.K.Terry《iphone xml解析流程》
     
    解析 web Service 的XML内容一直是一个难点,很多开发者在这一部分都十分的费力。下面我就我自己写的一个XML的例子来从头到尾的讲一遍其相关的内容。
    在很多的情况下,一个服务是通过某种网络API暴露的,它规定客户端发送什么,服务会在响应里发送什么,一般的来说大部分都返回xml格式的数据。
    我们来一个拿个接口实例来说一下: http://data.3g.sina.com.cn/api/index.php?page=1&test=1&wm=b100&cid=43
    这个一个网络请求地址,当网web Sevice发送这样的一个请求的时候返回的是这样的一个xml的数据:

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

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

    -(void)startTwitterParser

    {

    NSXMLParser *parser =[[NSXMLParser alloc]initWithData:twitterData];

    parser.delegate = self;

    [parser parse];

    [parser release];

    }

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

    #pragma mark NSXMLParserDelegate--->

    - (void)parserDidStartDocument:(NSXMLParser *)parser

    {

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

    parserObjects= [[NSMutableArrayalloc]init];//每一组信息都用数组来存,做后得到的数据就在这个数组中

    }

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

    {

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

    {

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

    [parserObjectsaddObject:newNode];

    twitterDic = newNode;

    }

    elseif(twitterDic)

    {

    if ([elementName isEqualToString:@"enclosure"])

    {

    //NSLog(@"%@",attributeDict);//存到字典下了

    if ([[attributeDict valueForKey:@"url"] hasSuffix:@"jpg"]) //encolsuer下的节点放在字典中

    {

    [twitterDicsetObject:[attributeDict valueForKey:@"url"] forKey:@"image"];

    }

    else

    {

    [twitterDicsetObject:[attributeDict valueForKey:@"url"] forKey:@"video"];

    }

    }

    else

    {

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

    [twitterDicsetObject:string forKey:elementName];

    [string release];

    currentText = [[NSStringalloc] init];

    currentElementName = elementName;

    }

    }

    }

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

    {

    currentText= [[NSString alloc] initWithString:string];

    }

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

    {

    if ([elementName isEqualToString:currentElementName])

    {

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

    }

    }

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

    {

    NSLog(@"%d %@",[parserObjects count],[[parserObjects objectAtIndex:0] valueForKey:@"title"]);

    }

    #pragma mark NSXMLParserDelegate end----->

     
    上面这个些方法都是NSXMLParser的代理方法,分别扮演着不同的角色
    首先是 - (void)parserDidStartDocument:(NSXMLParser *)parser
    这个方法是解析的开始的方法,我在这一步做的就是初始化了数组和字典了---就是以后存储数据的容器。
    接着就是第一步的解析:

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

    {

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

    {

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

    [parserObjects addObject:newNode];

    twitterDic = newNode;

    }

    elseif (twitterDic)

    {

    if ([elementName isEqualToString:@"enclosure"])

    {

    //NSLog(@"%@",attributeDict);//存到字典下了

    if ([[attributeDict valueForKey:@"url"] hasSuffix:@"jpg"]) //encolsuer下的节点放在字典中

    {

    [twitterDic setObject:[attributeDict valueForKey:@"url"] forKey:@"image"];

    }

    else

    {

    [twitterDic setObject:[attributeDict valueForKey:@"url"] forKey:@"video"];

    }

    }

    else

    {

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

    [twitterDic setObject:string forKey:elementName];

    [string release];

    currentText = [[NSString alloc] init];

    currentElementName = elementName;

    }

    }

    }

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

    {

    currentText = [[NSStringalloc] initWithString:string];

    }

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

    {

    if ([elementName isEqualToString:currentElementName])

    {

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

    }

    }

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

    {

    NSLog(@"%d %@",[parserObjectscount],[[parserObjectsobjectAtIndex:0] valueForKey:@"title"]);

    }

    通过分析xml内容的格式来看整个XML 是以<item>为节点的20条信息内容,而且每个<item>节点下有这着不同的信息,其中有个信息 是<enolsure>,它的下面又有几条信息。按照这样的格式分析,写下了以上代码。大家在写代码的时候要根据自己的需求来写的。通过不停 的触发这些代理方法,直到XML被解析完毕,20条信息就存在数组parserObjects里面了,而且每条信息都以字典的形式存在。于是一个我们可以 随时用的内容就生成了,上面最后一个代理方法的输出就是:20 和title下对应的字符串

  • 相关阅读:
    什么是IO多路复用
    Coursera, Machine Learning, Unsupervised Learning, K-means, Dimentionality Reduction
    Coursera, Machine Learning, SVM
    ShareSDK
    iOS JS和OC交互
    iOS KVO 常见错误
    第三方框架之SDWebImage
    单例存储账号
    UIRefreshControl
    二维码扫描
  • 原文地址:https://www.cnblogs.com/zhwl/p/2290387.html
Copyright © 2011-2022 走看看