XML 解析

来源:互联网 发布:金红米i7手机数据参数 编辑:程序博客网 时间:2024/06/06 00:55

1.XML 

#pragma mark - 下载解析数据

//开源中国动弹界面接口

#define OCTweetURL @"http://www.oschina.net/action/api/tweet_list?uid=0&pageIndex=5&pageSize=20"

//网络加载XML

-(void)startDownloadData

{

    NSString *urlString = OCTweetURL;

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    [manager GET:urlString parameters:nilsuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    //解析数据

           //XML解析第三方库

    GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:responseObject options:0 error:nil];

        if(doc)

        {

            @"//tweet"找到 "tweet"的节点,所有还含有"tweet"的节点

            NSArray *tweets = [doc nodesForXPath:@"//tweet" error:nil];

            for (GDataXMLElement *element in tweets)

            {

                //数据模型

                TweetModel *model = [[TweetModel allocinit];

                for (GDataXMLElement *subElement in element.children) {

                    [model setValue:subElement.stringValueforKey:subElement.name];

                }

                [_dataArray addObject:model];

                

            }

            

            [self.tableView reloadData];

        }

        

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"error = %@",error);

    }];

    

}


2 XML大致使用

//本地加载使用

-(void)manzuoXmlPsraser

{

    //<1>加载xml文件

    NSString *path = [[NSBundle mainBundlepathForResource:@"cate.xml"ofType:nil];

    NSData *data = [[NSData allocinitWithContentsOfFile:path];

    

    //<2>解析xml

    //  GDataXMLDocument 表示整个xml文档

    //参数1: xml数据以后放上下载数据

    //参数2: 默认0

    //参数3: 一般设置为nil

    GDataXMLDocument *doc = [[GDataXMLDocument allocinitWithData:dataoptions: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];

        

        PromotionModel *model = [[PromotionModel allocinit];

        model.id = id;

        model.name = name;

        model.price = price;

        // add array

    }

       

}

-(void)xmlBasicUse

{

    //xml解析

    

    //<1>加载xml文件

    NSString *path = [[NSBundle mainBundlepathForResource:@"xml.txt"ofType:nil];

    NSData *data = [[NSData allocinitWithContentsOfFile:path];

    

    //<2>解析xml

    //  GDataXMLDocument 表示整个xml文档

    //参数1: xml数据以后放上下载数据

    //参数2: 默认0

    //参数3: 一般设置为nil

    GDataXMLDocument *doc = [[GDataXMLDocument allocinitWithData:dataoptions: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 *)#>

}

GDataXML

来看GDataXML,它是一种DOM方式的解析类库。DOM实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。

在使用之前呢,我们还是先从网上下载GDataXML包,里面两个文件GDataXMLNode.h和GDataXMLNode.m导入到项目中来,编译,发现报错了,这是因为GDataXML是依赖libmxl2的,我们要去项目的Target中做一些设置。

  • 找到项目的Tarfet,进入Build Phases里面的Link Binary With Libraries,点击“加号”,搜索libxml,把出现的包添加进去,这里最新版的XCode7和iOS9中,是libxml.2.2.tbd。
  • 再来到Build Settings,我们可以搜索一下,找到Header Search Paths,添加路径“/usr/include/libxml2”。
  • 再找到Other Link Flags,添加“-libxml2“
  • 还有就是如果你下载的GDataXML是不支持ARC的,那么你就要像上面那样去添加“-fno-objc-arc”,这个视你下载的GDataXML包版本而定。

再次编译,就顺利通过了。

接下来看看我们怎么用这个东西。贴代码之前我真的想说一句,比起苹果原生的类库,这些开源的第三方类库真的在用起来的时候不知道有多舒服,懒人必备啊。在实际的开发中可以为我们节省很多的时间与精力,但是还是要搞懂人家原生的东西,这样才叫学会了么。

//ViewController.m- (IBAction)GDataXML:(id)sender {    NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];    NSData *data = [[NSData alloc]initWithContentsOfFile:path];    //对象初始化    GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data error:nil];    //获取根节点    GDataXMLElement *rootElement = [doc rootElement];    //获取其他节点    NSArray *students = [rootElement elementsForName:@"student"];    //初始化可变数组,用来显示到textView    self.GDatatext = [[NSMutableString alloc]initWithString:@""];    for (GDataXMLElement *student in students) {        //获取节点属性        GDataXMLElement *pidElement = [[student elementsForName:@"pid"] objectAtIndex:0];        NSString *pid = [pidElement stringValue];        GDataXMLElement *nameElement = [[student elementsForName:@"name"] objectAtIndex:0];        NSString *name = [nameElement stringValue];        GDataXMLElement *sexElement = [[student elementsForName:@"sex"] objectAtIndex:0];        NSString *sex = [sexElement stringValue];        GDataXMLElement *ageElement = [[student elementsForName:@"age"] objectAtIndex:0];        NSString *age = [ageElement stringValue];        //调整一下姿势,添加到可变长字符串~~        NSString *t = [NSString stringWithFormat:@"学号:%@ 姓名:%@ 性别:%@ 年龄:%@\n", pid, name, sex, age];        [self.GDatatext appendString:t];    }    self.textView.text = self.GDatatext;}

就一段,是不是看起来非常的舒服呢!



3 0
原创粉丝点击