• iOS--XML三种解析方法( XMLDictionary)、(GDataXMLNode)、(NSXMLParser)


    iOS9之后,默认网络请求是https,所有我们要设置一下网络安全,具体设置如下

    1.第三方类库 XMLDictionary

    下载地址:

    https://github.com/nicklockwood/XMLDictionary

     

    所用到的xml文件

    http://www.meituan.com/api/v1/divisions?mtt=1.help%2Fapi.0.0.im7eandj

    效果如下:

    代码实现:

    根视图:

    rootTableViewController.m文件

    复制代码
    #import "rootTableViewController.h"
    #import "XMLDictionary.h"
    #import "secondViewController.h"
    @interface rootTableViewController ()
    @property(nonatomic,strong)NSArray *cityArr;
    @end
    
    @implementation rootTableViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
       
        NSString *path=@"http://www.meituan.com/api/v1/divisions?mtt=1.help%2Fapi.0.0.im77fqda";
        
        NSURL *url=[NSURL URLWithString:path];
        
        
        NSData *data=[NSData dataWithContentsOfURL:url];
        
        XMLDictionaryParser *parser=[[XMLDictionaryParser alloc]init];
        NSDictionary *dic=[parser dictionaryWithData:data];
        self.cityArr=[NSArray arrayWithArray:dic[@"divisions"][@"division"]];
        
        
        
        
        
        NSLog(@"%@",self.cityArr);
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"reuseIdentifier"];
    
        self.title=@"城市列表";
    
        // Uncomment the following line to preserve selection between presentations.
        // self.clearsSelectionOnViewWillAppear = NO;
        
        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    //     self.navigationItem.rightBarButtonItem = self.editButtonItem;
        
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.cityArr.count;
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier" forIndexPath:indexPath];
        
        cell.textLabel.text=self.cityArr[indexPath.row][@"name"];
        return cell;
    }
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath{
        secondViewController *sec=[[secondViewController alloc]init];
        sec.location=self.cityArr[indexPath.row][@"location"];
        sec.title=self.cityArr[indexPath.row][@"name"];
        [self.navigationController pushViewController:sec animated:YES];
    
    
    }
    
    @end
    复制代码

    第二个视图:secondViewController.h

    复制代码
    #import <UIKit/UIKit.h>
    
    @interface secondViewController : UIViewController
    @property(nonatomic,strong)NSDictionary *location;
    @property(nonatomic,strong)NSString *title;
    
    @end
    复制代码

    secondViewController.m文件

    复制代码
    #import "secondViewController.h"
    
    @interface secondViewController ()
    @property(nonatomic,strong)UILabel *latitudeName;
    @property(nonatomic,strong)UILabel *longitudeName;
    @property(nonatomic,strong)UILabel *timezoneName;
    @property(nonatomic,strong)UILabel *latitude;
    @property(nonatomic,strong)UILabel *longitude;
    @property(nonatomic,strong)UILabel *timezone;
    @end
    
    @implementation secondViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self setKongjian];
    
        self.title=[NSString stringWithFormat:@"%@的经纬度",self.title];
        
        self.view.backgroundColor=[UIColor colorWithRed:0.148 green:1.000 blue:0.946 alpha:1.000];
        
    
    }
    -(void)setKongjian{
        self.latitudeName=[[UILabel alloc]initWithFrame:CGRectMake(100, 200, 100, 30)];
        self.latitudeName.text=@"纬度:";
        self.latitude=[[UILabel alloc]initWithFrame:CGRectMake(150, 200, 200, 30)];
        self.latitude.text=self.location[@"latitude"];
        
        
        self.longitudeName=[[UILabel alloc]initWithFrame:CGRectMake(100, 250, 100, 30)];
        self.longitudeName.text=@"经度:";
        self.longitude=[[UILabel alloc]initWithFrame:CGRectMake(150, 250, 200, 30)];
        self.longitude.text=self.location[@"longitude"];
        
        self.timezoneName=[[UILabel alloc]initWithFrame:CGRectMake(100, 300, 100, 30)];
        self.timezoneName.text=@"时区:";
        self.timezone=[[UILabel alloc]initWithFrame:CGRectMake(150, 300, 200, 30)];
        self.timezone.text=self.location[@"timezone"];
        
        
        [self.view addSubview:self.latitudeName];
        [self.view addSubview:self.longitudeName];
        [self.view addSubview:self.timezoneName];
    
        [self.view addSubview:self.latitude];
        [self.view addSubview:self.longitude];
        [self.view addSubview:self.timezone];
    
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    复制代码

    2.GDataXMLNode类库

    具体配置过程如下

     核心代码

    复制代码
    #import "rootTableViewController.h"
    #import "GDataXMLNode.h"
    #import "secondViewController.h"
    @interface rootTableViewController ()
    @property(nonatomic,strong)NSMutableDictionary *location;
    @property(nonatomic,strong)NSMutableArray *locationArr;
    @end
    
    @implementation rootTableViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.locationArr=[NSMutableArray array];
    //    获取网络上的xml
        NSURL *url=[NSURL URLWithString:@"http://www.meituan.com/api/v1/divisions?mtt=1.help%2Fapi.0.0.im7envub"];
        
        NSData *data=[NSData dataWithContentsOfURL:url];
        
    //   使用NSData对象初始化
        GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
        
    //    获取根节点
        GDataXMLElement *rootElement=[doc rootElement];
        
    //    获取根节点以下的节点
        GDataXMLElement *divisions=[[rootElement elementsForName:@"divisions"] objectAtIndex:0];
        NSArray *division=[divisions elementsForName:@"division"];
    
    //          NSLog(@"%@",division);
        for (GDataXMLElement *div in division) {
            self.location=[NSMutableDictionary dictionary];
    //        获取name的节点
            GDataXMLElement *nameElement=[[div elementsForName:@"name"] objectAtIndex:0];
            NSString *name=[nameElement stringValue];
           
            
    //    获取location 的节点
            GDataXMLElement *location=[[div elementsForName:@"location"] objectAtIndex:0];
            
    //        获取latitude 的节点
            GDataXMLElement *latitudeElement=[[location elementsForName:@"latitude"] objectAtIndex:0];
                NSString *latitude=[latitudeElement stringValue];
    
    //       获取longitude 的节点
            GDataXMLElement *longitudeElement=[[location elementsForName:@"longitude"] objectAtIndex:0];
            NSString *longitude=[longitudeElement stringValue];
            
    //        把他们的值加到一个=字典中
            [self.location setObject:name forKey:@"name"];
            [self.location setObject:latitude forKey:@"latitude"];
            [self.location setObject:longitude forKey:@"longitude"];
            
    //        把字典添加到可变集合中
            [self.locationArr addObject:self.location];
            
        }
        self.title=@"城市列表";
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"reuseIdentifier"];
     
    
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    #pragma mark - Table view data source
    
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.locationArr.count;
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier" forIndexPath:indexPath];
        
        cell.textLabel.text=self.locationArr[indexPath.row][@"name"];
        return cell;
    }
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath{
        secondViewController *sec=[[secondViewController alloc]init];
    //    把字典传递到第二个页面
        sec.location=self.locationArr[indexPath.row];
                [self.navigationController pushViewController:sec animated:YES];
       
        
        
    }
    
    @end
    复制代码

    第二个页面类似

    3.系统自带的

    核心代码

    复制代码
    #import "rootTableViewController.h"
    #import "secondViewController.h"
    @interface rootTableViewController ()<NSXMLParserDelegate>
    @property(nonatomic,strong)NSMutableArray *arr;
    @property(nonatomic,strong)NSMutableDictionary *dic;
    
    @property(nonatomic,strong)NSString *str;
    @end
    
    @implementation rootTableViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        NSURL *url=[NSURL URLWithString:@"http://www.meituan.com/api/v1/divisions?mtt=1.help%2Fapi.0.0.im7mg21x"];
        NSData *data=[NSData dataWithContentsOfURL:url];
        
        NSXMLParser *parser=[[NSXMLParser alloc]initWithData:data];
        
        parser.delegate=self;
        
        
        BOOL bol=[parser parse];
        NSLog(@"%d",bol);
        self.title=@"城市列表";
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"reuseIdentifier"];
    
    }
    
    -(void)parserDidStartDocument:(NSXMLParser *)parser{
        
        NSLog(@"start");
        self.arr=[NSMutableArray array];
    }
    -(void)parserDidEndDocument:(NSXMLParser *)parser{
        NSLog(@"end");
        NSLog(@"%@",self.arr);
    }
    
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
        
        if ([elementName isEqualToString:@"division"]) {
            self.dic=[NSMutableDictionary dictionary];
            
            [self.dic setDictionary:attributeDict];
        }
    }
    
    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        if ([elementName isEqualToString:@"name" ]||[elementName isEqualToString:@"latitude"]||[elementName isEqualToString:@"longitude"]) {
            [self.dic setObject:self.str forKey:elementName];
        }else if ([elementName isEqualToString:@"division"]){
            [self.arr addObject:self.dic];
        }
        
    }
    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        self.str=string;
        
        
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    #pragma mark - Table view data source
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.arr.count;
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier" forIndexPath:indexPath];
        
        cell.textLabel.text=self.arr[indexPath.row][@"name"];
        return cell;
    }
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        secondViewController *sec=[[secondViewController alloc]init];
        sec.location=self.arr[indexPath.row];
        [self.navigationController pushViewController:sec animated:YES];
        
        
    }
    @end
    复制代码

     

  • 相关阅读:
    【转】网络字节序与主机字节序
    VC之美化界面篇 (转)
    VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题(转)
    符验手记
    一友人昨夜接到电话,发生何事
    [转]众VC论道IT峰会:投资是否靠运气
    路过一个小摊,看到一个有趣的现象
    PJSUA提示要注册线程的解决办法
    彩票股票金融与运气之研究(五) 明敌
    随手测一局婚姻,留验
  • 原文地址:https://www.cnblogs.com/bolin-123/p/5327727.html
Copyright © 2020-2023  润新知