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];
- }
- /*
- // Override to support conditional editing of the table view.
- - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the specified item to be editable.
- return YES;
- }
- */
- /*
- // Override to support editing the table view.
- - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
- if (editingStyle == UITableViewCellEditingStyleDelete) {
- // Delete the row from the data source
- [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
- } else if (editingStyle == UITableViewCellEditingStyleInsert) {
- // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
- }
- }
- */
- /*
- // Override to support rearranging the table view.
- - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
- }
- */
- /*
- // Override to support conditional rearranging of the table view.
- - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the item to be re-orderable.
- return YES;
- }
- */
- /*
- #pragma mark - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- // Get the new view controller using [segue destinationViewController].
- // Pass the selected object to the new view controller.
- }
- */
- @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(, , , )];
- self.latitudeName.text=@"纬度:";
- self.latitude=[[UILabel alloc]initWithFrame:CGRectMake(, , , )];
- self.latitude.text=self.location[@"latitude"];
- self.longitudeName=[[UILabel alloc]initWithFrame:CGRectMake(, , , )];
- self.longitudeName.text=@"经度:";
- self.longitude=[[UILabel alloc]initWithFrame:CGRectMake(, , , )];
- self.longitude.text=self.location[@"longitude"];
- self.timezoneName=[[UILabel alloc]initWithFrame:CGRectMake(, , , )];
- self.timezoneName.text=@"时区:";
- self.timezone=[[UILabel alloc]initWithFrame:CGRectMake(, , , )];
- 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.
- }
- /*
- #pragma mark - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- // Get the new view controller using [segue destinationViewController].
- // Pass the selected object to the new view controller.
- }
- */
- @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: error:nil];
- // 获取根节点
- GDataXMLElement *rootElement=[doc rootElement];
- // 获取根节点以下的节点
- GDataXMLElement *divisions=[[rootElement elementsForName:@"divisions"] objectAtIndex:];
- NSArray *division=[divisions elementsForName:@"division"];
- // NSLog(@"%@",division);
- for (GDataXMLElement *div in division) {
- self.location=[NSMutableDictionary dictionary];
- // 获取name的节点
- GDataXMLElement *nameElement=[[div elementsForName:@"name"] objectAtIndex:];
- NSString *name=[nameElement stringValue];
- // 获取location 的节点
- GDataXMLElement *location=[[div elementsForName:@"location"] objectAtIndex:];
- // 获取latitude 的节点
- GDataXMLElement *latitudeElement=[[location elementsForName:@"latitude"] objectAtIndex:];
- NSString *latitude=[latitudeElement stringValue];
- // 获取longitude 的节点
- GDataXMLElement *longitudeElement=[[location elementsForName:@"longitude"] objectAtIndex:];
- 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];
- }
- /*
- // Override to support conditional editing of the table view.
- - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the specified item to be editable.
- return YES;
- }
- */
- /*
- // Override to support editing the table view.
- - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
- if (editingStyle == UITableViewCellEditingStyleDelete) {
- // Delete the row from the data source
- [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
- } else if (editingStyle == UITableViewCellEditingStyleInsert) {
- // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
- }
- }
- */
- /*
- // Override to support rearranging the table view.
- - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
- }
- */
- /*
- // Override to support conditional rearranging of the table view.
- - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the item to be re-orderable.
- return YES;
- }
- */
- /*
- #pragma mark - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- // Get the new view controller using [segue destinationViewController].
- // Pass the selected object to the new view controller.
- }
- */
- @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"];
- // 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)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];
- }
- /*
- // Override to support conditional editing of the table view.
- - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the specified item to be editable.
- return YES;
- }
- */
- /*
- // Override to support editing the table view.
- - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
- if (editingStyle == UITableViewCellEditingStyleDelete) {
- // Delete the row from the data source
- [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
- } else if (editingStyle == UITableViewCellEditingStyleInsert) {
- // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
- }
- }
- */
- /*
- // Override to support rearranging the table view.
- - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
- }
- */
- /*
- // Override to support conditional rearranging of the table view.
- - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
- // Return NO if you do not want the item to be re-orderable.
- return YES;
- }
- */
- /*
- #pragma mark - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- // Get the new view controller using [segue destinationViewController].
- // Pass the selected object to the new view controller.
- }
- */
- @end
iOS xml文件的解析方式 XMLDictionary,GDataXMLNode,NSXMLParser的更多相关文章
- 用java操作XML文件(DOM解析方式)
XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...
- XML文件的解析方式
XML文件4种解析方式分别是:DOM解析,SAX解析,JDOM解析,DOM4J解析.1.基础方法:DOM:与平台无关的官方的解析方式.SAX:Java平台提供的基于事件驱动的解析方式.2.扩展方法(在 ...
- [置顶] Android开发之XML文件的解析
Android系统开发之XML文件的解析 我们知道Http在网络传输中的数据组织方式有三种分别为:XML方式.HTML方式.JSON方式.其中XML为可扩展标记语言,如下: <?xml vers ...
- mybatis源码-解析配置文件(一)之XML的DOM解析方式
目录 简介 Java 中 XML 文件解析 解析方式 DOM 解析 XML 新建 XML 文件 DOM 操作相关类 Java 读取 XML 文件 一起学 mybatis @ 简介 在之前的文章< ...
- 用SAX和PULL进行XML文件的解析与生成
XML解析有传统的dom方法还有Jsoup,SAX,PULL等,这里讲的是比较省内存的SAX和PULL方法.Android中极力推荐用PULL的方式来解析,我个人觉得pull确实比较简单,但其内部的逻 ...
- 【文件处理】xml 文件 DOM解析
一.Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath 此文针对其中的DOM方法具体展开介绍及代码分析 sax.dom是两种对xml文档进行解析的方法(没有具体实 ...
- 使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置
1.使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置 2.上代码:在resources目录下新建:generatorConfiguration.xml文 ...
- JDOM方法实现对XML文件的解析
首先要下载JDOM.jar包,下载地址:http://download.csdn.net/detail/ww6055/8880371 下载到JDOM.jar包之后导入到工程中去. 实例程序: book ...
- iOS Crash文件的解析
iOS Crash文件的解析 开发程序的过程中不管我们已经如何小心,总是会在不经意间遇到程序闪退.脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候,流畅的操作被无情地Crash打断.联想起 ...
随机推荐
- MyBatis3:SQL映射
前言 前面学习了config.xml,下面就要进入MyBatis的核心SQL映射了,第一篇文章的时候,student.xml里面是这么写的: <?xml version="1.0&qu ...
- Phaser-游戏之旅
虽然这个小游戏逻辑不是很复杂,但为了熟悉Phaser这个游戏框架的使用方法所以就选择了它. 另外第一次在项目中尝试使用ES6,之后利用babel进行转换. 自动化构建:gulp(其他文件复制和解析) ...
- Jquery双向select控件Bootstrap Dual Listbox
效果预览: 一. 下载插件 github地址:https://github.com/istvan-ujjmeszaros/bootstrap-duallistbox 也可以在这个网站中下载:http: ...
- 转职成为TypeScript程序员的参考手册
写在前面 作者并没有任何可以作为背书的履历来证明自己写作这份手册的分量. 其内容大都来自于TypeScript官方资料或者搜索引擎获得,期间掺杂少量作者的私见,并会标明. 大部分内容来自于http:/ ...
- [转]keil使用详解
第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...
- win10更新系统后wifi连接不上了怎么解决?
遇到了一个小问题,由于更新了一下win10,发现wifi不能用了,以为是wifi密码错了,选择忘记密码试了两次,又试了不同的wifi都不行,发现网卡无线驱动也没事,在网上百度了好久发现说的方法都没用, ...
- JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
- ★Kali信息收集~★7.FPing :ip段扫描
参数: 使用方法: fping [选项] [目标...] -a显示是活着的目标 -A 显示目标地址 -b n 大量 ping 数据要发送,以字节为单位 (默认 56) -B f 将指数退避算法因子设置 ...
- 前端学HTTP之基本认证
前面的话 人们用Web进行私人事务处理,访问私有的数据.通过Web可以很方便地访问这些信息,但仅仅是方便访问还是不够的.我们要保证只有特定的人能看到我们的敏感信息并且能够执行我们的特权事务 服务器需要 ...
- spring boot(一):入门篇
构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...