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解析

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

原文地址:https://www.cnblogs.com/caolongs/p/4775206.html