zoukankan      html  css  js  c++  java
  • XML解析GData、XMLParser

    ---恢复内容开始---

    /*
     <tweet>
     <id>6462192</id>
     <portrait>
     http://static.oschina.net/uploads/user/587/1175932_50.jpg?t=1418648003000
     </portrait>
     <author>
     <![CDATA[ fywtat ]]>
     </author>
     <authorid>1175932</authorid>
     <body>
     <![CDATA[ 又被赶出来睡沙发 :smile: ]]>
     </body>
     <attach/>
     <appclient>3</appclient>
     <commentCount>1</commentCount>
     <pubDate>2015-09-01 00:05:27</pubDate>
     <imgSmall/>
     <imgBig/>
     <likeCount>2</likeCount>
     <isLike>0</isLike>
     <likeList>...</likeList>
     </tweet>
     */
    
    =====================================
    #pragma mark - 下载解析数据
    -(void)startDownloadData
    {
        NSString *urlString = OCTweetURL;
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            
            //解析数据
            GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:responseObject options:0 error:nil];
            if(doc)
            {
                NSArray *tweets = [doc nodesForXPath:@"//tweet" error:nil];
                for (GDataXMLElement *element in tweets)
                {
                    TweetModel *model = [[TweetModel alloc] init];
                    for (GDataXMLElement *subElement in element.children) {
                        [model setValue:subElement.stringValue forKey:subElement.name];
                    }
                    [_dataArray addObject:model];
                    
                }
                [self.tableView reloadData];
            }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"error = %@",error);
        }];
        
    }
    //根据传入的结点创建model代码
    -(void)createModelCodeByElement:(GDataXMLElement *)element modelName:(NSString *)name
    {
        printf("
    @interface %s : NSObject
    ",name.UTF8String);
        for (GDataXMLElement *subElement in element.children)
        {
            printf("@property (copy,nonatomic) NSString *%s;
    ",subElement.name.UTF8String);
        }
        printf("@end
    ");
    }
    View Code
    <oschina>
    <tweetCount>500</tweetCount>
    <!--  总动弹数  -->
    <pagesize>20</pagesize>
    <tweets>
    <tweet>
    <id>6463329</id>
    <portrait>
    http://static.oschina.net/uploads/user/716/1433031_50.jpg?t=1433144307000
    </portrait>
    <author>
    <![CDATA[ ahhg ]]>
    </author>
    <authorid>1433031</authorid>
    <body>
    <![CDATA[ 技术水平不上不下,有点迷茫了 ]]>
    </body>
    <attach/>
    <appclient>1</appclient>
    <commentCount>0</commentCount>
    <pubDate>2015-09-01 09:44:43</pubDate>
    <imgSmall/>
    <imgBig/>
    <likeCount>0</likeCount>
    <isLike>0</isLike>
    <likeList></likeList>
    </tweet>
    <tweet>...</tweet>
    <tweet>...</tweet>
    <tweet>
    解析数据

     GData

    -(void)startDownloadData
    {
        NSString *urlString = OCTweetURL;
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            
            //解析数据
            GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:responseObject options:0 error:nil];
            if(doc)
            {
                //存取tweet节点的数组
                NSArray *tweets = [doc nodesForXPath:@"//tweet" error:nil];
                //遍历单个tweet节点,一个element属于一个tweet节点
                for (GDataXMLElement *element in tweets)
                {
    
                    TweetModel *model = [[TweetModel alloc] init];
                    //遍历element(tweet)的子节点 element.children 属于一个数组
                    //<id>6463329</id> 一个subElement节点的键与值
                    for (GDataXMLElement *subElement in element.children) {
                        [model setValue:subElement.stringValue forKey:subElement.name];
                    }
                    [_dataArray addObject:model];
                }
                
                [self.tableView reloadData];
            }
            
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"error = %@",error);
        }];
        
    }

     

        //<4>获取带有属性的结点
        array = [doc nodesForXPath:@"/root/systemConfig/IntentionLevel/Item" error:nil];
        for (GDataXMLElement *e in array) {
            NSLog(@"name = %@",e.name);
            //属性如何获取
            //  结点的attributes包含的结点的所有属性
            //  属性用GDataXMLElement
            for(GDataXMLElement *a in e.attributes)
            {
                NSLog(@"attr name=%@ value=%@",a.name,a.stringValue);
            }
        }

    常用解析

    <?xml version="1.0" encoding="utf-8" ?>
    <root>
        <systemConfig>
          <CityName>北京</CityName>
          <CityCode>201</CityCode>
          <ParentCityCode> 0</ParentCityCode>
          <areaCode>010</areaCode>
          <AgreementUrl></AgreementUrl>
          <IntentionLevel>                       
            <Item key="1" value="A"></Item>
            <Item key="2" value="B"></Item>
            <Item key="3" value="C"></Item>
          </IntentionLevel>
          <ComeChannel>                           
            <Item key="1" value="报纸"></Item>
            <Item key="2" value="杂志"></Item>
          </ComeChannel>
          <BuyCarBudget>                       
            <Item key="1" value="40-50万"></Item>
            <Item key="2" value="50-60万"></Item>
          </BuyCarBudget>
         <IntentionColor>
             <Item key="1" value="红"></Item>
             <Item key="2" value="黄"></Item>
         </IntentionColor>
        </systemConfig>
    </root>
    xml文件
        //xml解析
        
        //<1>加载xml文件
        NSString *path = [[NSBundle mainBundle] pathForResource:@"xml.txt" ofType:nil];
        NSData *data = [[NSData alloc] initWithContentsOfFile:path];
        
        //<2>解析xml
        //  GDataXMLDocument 表示整个xml文档
        //参数1: xml数据, 以后放上下载数据
        //参数2: 默认0
        //参数3: 一般设置为nil
        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
        
        //<3>从解析后的文档中获取数据
        //核心: 使用XPath语法
        //实例 CityName结点的XPath
        //      /root/SystemConfig/CityName
        //  返回匹配xpath语法规则的结点数组
        NSArray *array = [doc nodesForXPath:@"/root/systemConfig/CityName" error:nil];
        GDataXMLElement *citName = [array firstObject];
        NSLog(@"name=%@ value=%@",citName.name,citName.stringValue);
        
        //<4>获取带有属性的结点
        array = [doc nodesForXPath:@"/root/systemConfig/IntentionLevel/Item" error:nil];
        for (GDataXMLElement *e in array) {
            NSLog(@"name = %@",e.name);
            
            //属性如何获取
            //  结点的attributes包含的结点的所有属性
            //  属性用GDataXMLElement
            for(GDataXMLElement *a in e.attributes)
            {
                NSLog(@"attr name=%@ value=%@",a.name,a.stringValue);
            }
        }
        
        //<5>快速获取某种类型的结点 (项目中常用)
        //实例: 获取所有的名字为Item的结点, 而不管在哪儿?
        //XPath:  //Item
        array = [doc nodesForXPath:@"//Item" error:nil];
        for (GDataXMLElement *e in array) {
            NSLog(@"-> %@",e.name);
        }
        
        //<6>遍历xml文档
        //GDataXMLElement *root =  doc.rootElement;
        
        //获取一个结点子节点
        //root.children
        
        //子节点个数
        //root.childCount
        
        //获取某个名字的子节点
        //root elementsForName:<#(NSString *)#>
    GData基本使用

    建模使用

    <response>
      <result>0</result>
      <cuttotal>28</cuttotal>
      <total>274</total>
      <shareprefix>我在 @满座 手机客户端(app.manzuo.com)发现了一款产品,觉得不错,推荐给大家:</shareprefix>
      <buyprefix>我刚通过 @满座 手机客户端(app.manzuo.com)购买了一款产品,觉得不错,推荐给大家:</buyprefix>
      <list>
        <promotion>
          <id>224130</id>
          <surl><![CDATA[http://mps.manzuo.com/mps/pdstt?id=224130&pg=0&f=cat]]></surl>
          <durl><![CDATA[http://mp.manzuo.com/china/prm/22/224130.xml]]></durl>
          <wsdimg><![CDATA[http://p0.manzuo.com/22/224130/06834354_w_more.jpg]]></wsdimg>
          <name><![CDATA[星美国际影城百老汇影城兑换券]]></name>
          <multipagetitle><![CDATA[【15店通用】星美国际影城百老汇影城16家分店通用兑换券!2D/3D可兑!]]></multipagetitle>
          <price>100.0</price>
          <priceoff>22.5</priceoff>
          <currentdealcount>1645</currentdealcount>
          <starttime>2014-02-18 00:00:00</starttime>
          <endtime>2014-09-28 23:59:59</endtime>
          <sevenrefundallowed>0</sevenrefundallowed>
          <expirerefundallowed>0</expirerefundallowed>
          <district>北京</district>
          <type2>2</type2>
          <hassub>-1</hassub>
          <flag>0</flag>
        </promotion>
        <promotion>
    xml文件2
    //<1>加载xml文件
        NSString *path = [[NSBundle mainBundle] pathForResource:@"cate.xml" ofType:nil];
        NSData *data = [[NSData alloc] initWithContentsOfFile:path];
        
        //<2>解析xml
        //  GDataXMLDocument 表示整个xml文档
        //参数1: xml数据, 以后放上下载数据
        //参数2: 默认0
        //参数3: 一般设置为nil
        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
        
        //获取所有的promotion结点
        //XPath: //promotion
        NSArray *array = [doc nodesForXPath:@"//promotion" error:nil];
        for (GDataXMLElement *e in array) {
            NSLog(@"name = %@",e.name);
            NSString *id = [[[e elementsForName:@"id"] firstObject] stringValue];
            NSString *name = [[[e elementsForName:@"name"] firstObject] stringValue];
            NSString *price = [[[e elementsForName:@"price"] firstObject] stringValue];
            NSLog(@"-> %@ %@ %@",id,name,price);
            
            PromotionModel *model = [[PromotionModel alloc] init];
            model.id = id;
            model.name = name;
            model.price = price;
            // add array
    View Code

    系统XML解析

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 每个XML文档都由XML序言开始,告诉解析器或浏览器这个文件应该按照XML规则进行解析 -->
    
    
    <!-- XML标签没有被预定义,你需要自行定义标签。XML被设计为具有自我描述性 -->
    <qfclass>
        <student>
            <name>优衣库</name>
            <address>北京三里屯</address>
        </student>
        <student>
            <name>黑人</name>
            <address>美国加利福尼亚</address>
        </student>
        <student>
            <name>毛爷爷</name>
            <address>中国精英</address>
        </student>
        <student>
            <name>葫芦小金刚</name>
            <address>葫芦娃</address>
        </student>
        <student>
            <name>蛇精</name>
            <address>报告大王</address>
        </student>
    </qfclass>
    View Code XML
     1 #import "CLJXMLParser.h"
     2 #import "Student.h"
     3 
     4 @interface MCJXMLParser ()<NSXMLParserDelegate>
     5 {
     6     NSMutableString  *_elementStr;
     7     Student          *_student;
     8     
     9 }
    10 @end
    11 
    12 @implementation MCJXMLParser
    13 - (void)test
    14 {
    15     NSString *path = @"/Users/ms/Desktop/备课/0814/test.xml";
    16     NSData *data = [NSData dataWithContentsOfFile:path];
    17     
    18     // 解析器
    19     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    20     parser.delegate = self;
    21 
    22     // 开始解析
    23     [parser parse];
    24 }
    25 
    26 #pragma mark - NSXMLParserDelegate
    27 
    28 #pragma mark  开始解析文档,在这里做初始化工作
    29 - (void)parserDidStartDocument:(NSXMLParser *)parser
    30 {
    31     _arrayM = [NSMutableArray array];
    32     _elementStr = [NSMutableString string];
    33 }
    34 
    35 #pragma mark 开始读取节点 清空缓存数据
    36 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    37 {
    38     if ([elementName isEqualToString:@"student"]) {
    39         _student = [[Student alloc] init];
    40     }
    41     // 清空拼接字符串
    42     [_elementStr setString:@""];
    43 }
    44 
    45 #pragma mark  循环查找节点内容
    46 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    47 {
    48     // 拼接字符串
    49     [_elementStr appendString:string];
    50 }
    51 
    52 #pragma mark 一个节点完成
    53 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    54 {
    55     NSString *result = [NSString stringWithString:_elementStr];
    56     if ([elementName isEqualToString:@"student"]) {
    57         [_arrayM addObject:_student];
    58     } else if ([elementName isEqualToString:@"name"]){
    59         _student.name = result;
    60     } else if ([elementName isEqualToString:@"address"]) {
    61          _student.address = result;
    62     }
    63 }
    64 
    65 #pragma mark 解析完成,处理数据
    66 - (void)parserDidEndDocument:(NSXMLParser *)parser
    67 {
    68     NSLog(@"%@", _arrayM);
    69 }
    70 
    71 #pragma mark 解析出错,清理数据
    72 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
    73 {
    74     // 解析发生错误,需要把解析过程中生成数据清除,否则会出现不必要的麻烦
    75     [_arrayM removeAllObjects];
    76 }
    77 @end
    NSXMLParser解析

    ---恢复内容结束---

  • 相关阅读:
    目前主要的测试用例设计方法是什么?
    软件的安全性应从哪几个方面去测试?
    软件产品质量特性是什么?
    在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
    简述什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试
    详细的描述一个测试活动完整的过程
    在搜索引擎中输入汉字就可以解析到对应的域名,请问如何用LoadRunner进行测试。
    String是最基本的数据类型吗?
    1、面向对象的特征有哪些方面
    说出Servlet的生命周期,并说出Servlet和CGI的区别。
  • 原文地址:https://www.cnblogs.com/caolongs/p/4775206.html
Copyright © 2011-2022 走看看