iOS XML/JSON解析

<a target=_blank href="http://download.csdn.net/detail/vaercly/7908319">点击打开下载链接iOS,XML/JSON解析</a>
//  FInterPreterVC.m
//  FInterpreter
//
//  Created by lanouhn on 14-9-11.
//  Copyright (c) 2014年 [email protected] 陈聪雷. All rights reserved.
//

#import "FInterPreterVC.h"
#import "Person.h"
#import "GDataXMLNode.h"
#import "JSONKit.h"
@interface FInterPreterVC ()<NSXMLParserDelegate>
@property (nonatomic, retain) NSMutableArray *arr;//用来存储person对象
@property (nonatomic, retain) Person *per;//用来存储信息
@property (nonatomic, retain) NSString *str;//存储读到的字符串
@end

@implementation FInterPreterVC

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
/**
 *  解析:按照一种约定好的格式(假象), 有后台开发人员, 按照格式存数据, 由前端按照格式取数据(谨记: 这种格式是由后台开发人员决定的, 我们无权决定)
    解析的本质: 按照约定好的格式取出我们想要数据的过程
    当今比较流行的格式:XML和JSON格式
    XML解析两种解析原理:
    SAX解析:基于事件回调的解析机制, 就是使用协议以及代理. SAX解析是逐行解析, 读入数据时只读入一行, 一行一行的解析, 所以SAX解析占用内存较小, 适合于大数据解析
    DOM解析:一次性将内容全部读入内存, 将内容读成树形结构, 逐层解析, 适合小数据解析
 */
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    UILabel *XMLLabel = [[UILabel alloc] initWithFrame:CGRectMake(110, 30, 100, 30)];
    XMLLabel.text = @"XML解析";
    XMLLabel.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:XMLLabel];
    [XMLLabel release];

    UILabel *JSONLabel = [[UILabel alloc] initWithFrame:CGRectMake(110, 200, 100, 30)];
    JSONLabel.text = @"JSON解析";
    JSONLabel.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:JSONLabel];
    [JSONLabel release];

    NSArray *titles = @[@"SAX解析",@"Dom解析第一种方式",@"Dom解析第二种方式",@"系统解析",@"字符串解析",@"数组解析",@"字典解析",@"Data解析"];
    NSArray *methods = @[@"handleSAX:",@"handleDomBtn1:",@"handleDomBtn2:",@"handleSystemJSON:",@"handleStrBtn:",@"handleArrBtn:",@"handleDicBtn:",@"handleDataBtn:"];
    CGFloat height = 70;
    for (int i = 0; i < 8; i++) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
        btn.frame = CGRectMake(60, height, 200, 30);
        btn.backgroundColor = [UIColor greenColor];
        [btn setTitle:titles[i] forState:UIControlStateNormal];
        SEL selector = NSSelectorFromString(methods[i]);
        [btn addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btn];
        if (i == 2) {
            height = 200;
        }
        height += 40;
    }
    UILabel *text = [[UILabel alloc] initWithFrame:CGRectMake(110, 470, 100, 30)];
    text.text = @"加油!";
    text.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:text];
    [text release];
}
//SAX解析
- (void)handleSAX:(UIButton *)btn
{
    //1 获取解析的文件路径
    NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"xml"];
    //2 根据文件路径初始化NSData对象
    NSData *data = [NSData dataWithContentsOfFile:xmlPath];
    //3 创建解析工具对象
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    //4 设置代理
    parser.delegate = self;
    //5 开始解析
    [parser parse];
}

#pragma mark - NSXMLParserDetegate
//当读取到开始标签时触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"start %@", attributeDict);
    //当数据存储到开始标签的属性中时, 处理方式
    if ([elementName isEqualToString:@"Persons"]) {
        //为数组开辟空间
        self.arr = [NSMutableArray array];
    } else if ([elementName isEqualToString:@"person"]) {
        //为person对象开辟空间
        self.per = [[[Person alloc] init] autorelease];
        [self.arr addObject:self.per];
    } else if ([elementName isEqualToString:@"name"]) {
        self.per.name = attributeDict[@"name"];
    } else if ([elementName isEqualToString:@"gender"]) {
        self.per.gender = attributeDict[@"gender"];
    } else if ([elementName isEqualToString:@"age"]) {
        self.per.age = attributeDict[@"age"];
    } else if ([elementName isEqualToString:@"phoneNumber"]) {
        self.per.phoneNumber = attributeDict[@"phoneNumber"];
    } else if ([elementName isEqualToString:@"imageName"]) {
        self.per.imageName = attributeDict[@"imageName"];
    }

    //当数据存储到开始标签以及结束标签中时, 处理方式
    /*
    if ([elementName isEqualToString:@"Persons"]) {
        //为数组开辟空间
        self.arr = [NSMutableArray array];
    } else if ([elementName isEqualToString:@"person"]) {
        //为perosn对象开辟空间
        self.per = [[[Person alloc] init] autorelease];
    }
     */
}
//当读到标签后的内容时触发
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//    NSLog(@"content %@", string);
    //保存读取到得数据
//    self.str = string;
}
//当读取到结束标签时触发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"end %@", elementName);

    /*
    if ([elementName isEqualToString:@"name"]) {
        self.per.name = self.str;
    } else if ([elementName isEqualToString:@"gender"]) {
        self.per.gender = self.str;
    } else if ([elementName isEqualToString:@"age"]) {
        self.per.age = self.str;
    } else if ([elementName isEqualToString:@"phoneNumber"]) {
        self.per.phoneNumber = self.str;
    } else if ([elementName isEqualToString:@"imageName"]) {
        self.per.imageName = self.str;
    } else if ([elementName isEqualToString:@"person"]) {
        //当读到person的结束标签时, person对象已经赋值完毕, 存储到数组中
        [self.arr addObject:self.per];
    }
     */
}
//当解析完毕之后触发
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"game over");
    NSLog(@"%@", self.arr);
}

//DOM解析第一种方式
/**
 *  DOM解析使用Google提供的一个开源高效的解析工具GDataXMLNode, 它的效果要比NSXMLParser要快10倍
    使用方式:
    1 先导入系统动态链接库 libxml2.2.dylib
    2 在buildSettings中的Header Search Path中添加/usr/include/libxml2
    3 在buildSettings中的Other Linker Flags中添加-lxml2
 */
- (void)handleDomBtn1:(UIButton *)btn
{
    //1 获取解析文件的路径
    NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"xml"];
    //2 初始化xml字符串
    NSString *xmlStr = [NSString stringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncoding error:nil];
    //3 初始化一个GDataXMLDocument对象, 因为解析时所有的内容都是从该对象中读取(所以需要将要解析的内容存在该对象中)
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];
    //4 获取根节点
    GDataXMLElement *rootElement = [document rootElement];
    //5 获取根节点的所有子节点
    NSArray *personElements = [rootElement elementsForName:@"person"];
    //6 先获取数组得到每一个person节点, 然后再得到perosn节点下的子节点
    for (GDataXMLElement *element in personElements) {
        //获取perosn节点下的name节点
        GDataXMLElement *nameElement = [[element elementsForName:@"name"] firstObject];
        //获取perosn节点下的gender节点
        GDataXMLElement *genderElement = [[element elementsForName:@"gender"] firstObject];
        //获取perosn节点下的age节点
        GDataXMLElement *ageElement = [[element elementsForName:@"age"] firstObject];
        //获取perosn节点下的imageName节点
        GDataXMLElement *imageNameElement = [[element elementsForName:@"imageName"] firstObject];
        //获取perosn节点下的phoneNumber节点
        GDataXMLElement *phoneNumberElement = [[element elementsForName:@"phoneNumber"] firstObject];
        //1 获取开始标签与结束标签的值
        /*
        NSString *name = [nameElement stringValue];
        NSString *gender = [genderElement stringValue];
        NSString *age = [ageElement stringValue];
        NSString *imageName = [imageNameElement stringValue];
        NSString *phoneNumber = [phoneNumberElement stringValue];
        NSLog(@"=======%@ %@ %@ %@ %@", name, gender, age, imageName, phoneNumber);
         */
        //2 获取表现中属性中存储的数据
        //属性对应的类是GDataXMLNode
        GDataXMLNode *nameNode = [nameElement attributeForName:@"name"];
        GDataXMLNode *genderNode = [genderElement attributeForName:@"gender"];
        GDataXMLNode *ageNode = [ageElement attributeForName:@"age"];
        GDataXMLNode *imageNameNode = [imageNameElement attributeForName:@"imageName"];
        GDataXMLNode *phoneNumberNode = [phoneNumberElement attributeForName:@"phoneNumber"];
        NSString *name = [nameNode stringValue];
        NSString *gender = [genderNode stringValue];
        NSString *age = [ageNode stringValue];
        NSString *phoneNumber = [phoneNumberNode stringValue];
        NSString *imageName = [imageNameNode stringValue];
        NSLog(@"%@ %@ %@ %@ %@", name, gender, age, phoneNumber, imageName);
    }
}

- (void)handleDomBtn2:(UIButton *)btn
{
    //1 获取解析文件的路径
    NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"xml"];
    //2 初始化xml字符串
    NSString *xmlStr = [NSString stringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncoding error:nil];
    //3 初始化一个GDataXMLDocument对象, 因为解析时所有的内容都是从该对象中读取(所以需要将要解析的内容存在该对象中)
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];
    /**
     *  XPath 只要给定相对路径即可, 如://name, 只要能够到达name, 都可以把name获取到
     */
    //4 获取所有的name节点
    NSArray *nameElements = [document nodesForXPath:@"//name" error:nil];
    //获取所有的gender节点
    NSArray *genderElements = [document nodesForXPath:@"//gender" error:nil];
    //获取所有的age节点
    NSArray *ageElements = [document nodesForXPath:@"//age" error:nil];
    //获取所有的imageName节点
    NSArray *imageNameElements = [document nodesForXPath:@"//imageName" error:nil];
    //获取所有的phoneNumber节点
    NSArray *phoneNumberElements = [document nodesForXPath:@"//phoneNumber" error:nil];
    //通过循环取出每个节点
    for (int i = 0; i < 3; i++) {
        GDataXMLElement *nameElement = nameElements[i];
        GDataXMLElement *genderElement = genderElements[i];
        GDataXMLElement *ageElement = ageElements[i];
        GDataXMLElement *imageNameElement = imageNameElements[i];
        GDataXMLElement *phoneNumberElement = phoneNumberElements[i];
        NSString *name = [nameElement stringValue];
        NSString *gender = [genderElement stringValue];
        NSString *age = [ageElement stringValue];
        NSString *imageName = [imageNameElement stringValue];
        NSString *phoneNumber = [phoneNumberElement stringValue];
        NSLog(@"-------%@ %@ %@ %@ %@", name, gender, age, imageName, phoneNumber);
    }
}

//系统的解析方式
- (void)handleSystemJSON:(UIButton *)btn
{
    //1 获取文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
    //2 初始化NSData对象
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    //3 解析
    NSMutableArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@", arr);
}

//JSONKit类的解析方式
/**
 *  对于JSONKit 提供的解析方式,是为NSString,NSData添加分类的方式,在分类中添加了解析的方法.效率仅次于系统的.
 将json格式数据解析成NSArray,NSDictionary.
 而为NSArray,NSDictionary添加的分类的方法,则是将OC的对象,转化为JSON格式字符串.
 *
 */
- (void)handleStrBtn:(UIButton *)btn
{
    //1 获取文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
    //2 初始化NSString对象
    NSString *jsonStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    //3 解析
    NSArray *arr = [jsonStr objectFromJSONString];
    NSLog(@"%@", arr);
}

- (void)handleArrBtn:(UIButton *)btn
{
    //1 将OC的数组转换为json格式化字符串
    NSArray *arr = @[@1,@"bb",@"cc",@"dd",@"ee"];
    //转化
    NSString *jsonStr = [arr JSONString];
    NSLog(@"%@", jsonStr);
    //2 解析
    NSString *str = [jsonStr objectFromJSONString];
    NSLog(@"%@", str);
}

- (void)handleDicBtn:(UIButton *)btn
{
    //1 将OC的字典转换为json格式化字符串
    NSDictionary *dic = @{@"name":@1,@"gender":@"man",@"age":@"18"};
    //转化
    NSString *jsonStr = [dic JSONString];
    NSLog(@"%@", jsonStr);
    //2 解析
    NSString *str = [jsonStr objectFromJSONString];
    NSLog(@"%@", str);
}

- (void)handleDataBtn:(UIButton *)btn
{
    //1 获取文件路径
    NSString *fileParth = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
    //2 初始化NSData对象
    NSData *jsonData = [NSData dataWithContentsOfFile:fileParth];
    //3 解析
    NSArray *arr = [jsonData objectFromJSONData];
    NSLog(@"%@", arr);
}

- (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.
}
*/

- (void)dealloc
{
    self.arr = nil;
    self.per = nil;
    self.str = nil;
    [super dealloc];
}

@end

时间: 2024-10-14 15:12:13

iOS XML/JSON解析的相关文章

ios webservice编程:soap封装调用,返回xml,json解析

一.简介 webservice调用,包括soap请求与响应,返回(xml,json)解析. soap请求与响应:ios webservice+soap编程 xml,json解析:ios XML,JSON,数组解析并转换成NSMutableArray(List<class>) 二.项目 完整项目:点击下载 三.效果 soap请求与响应: xml,json解析:    

(转)iOS XML JSON SQLite CoreData 数据持久化

一.文件操作 1.因为应用是在沙盒(Sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件: * Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 * tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除 * Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下的文件不会在应用退出删除 2.相关方法:       # 使用NSSearchPathForDiretoriesI

UI学习笔记---第十六天XML JSON解析

一.解析的基本概念 从事先规定好的格式中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据,数据方按照格式获取数据 常见解析方式XML解析JSON解析 二.XML:可扩展标记语言 XML数据格式的功能:数据交换 web服务  内容管理  用作配置文件 一对标签称为一个节点  节点可以包含节点   没有子节点叫叶子节点  只有一个根节点  节点可以相互嵌套 三.进行XML解析时使用到的SAX工具 SAX:Simple API for XML  基于事件驱动的解析方式,逐行解析数据.(

iOS 中json解析数据出现中文乱码的问题

一般服务器的编码格式都是UTF8,这样通过json解析下来的的数据,一般中文是不会出现乱码,但是如果服务器的编码格式不是UTF8,通过json解析的数据中的中文容易出现luan乱码,怎么解决这个问题呢? 一般都是通过转码来解决,但是直接转码,是不能达到效果的,例如 [jsonStringstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 这样直接转码是达不到效果的. 解析数据的时候,可以先把数据存放在NSdata对象中,

ios XML,JSON,数组解析并转换成NSMutableArray(List&lt;class&gt;)

一.简介 JSON解析: 通过正则将JSON([{...},{...}...])分解成多个包含实体实例内容的一小节({...}),在一小节中通过Runtime(运行时)(<objc/runtime.h>)将实体所有属性值找到并赋值(正则查找实现)到实例({...} --> 实体的一个实例),遍历所有小节({...})就将XML转换成NSMutableArray(类似:List<class>). XML 解析: 通过GDataXml(也可以通过正则)将XML分解成多个包含实体实

IOS中Json解析的四种方法

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的ios版本,可以使用第三方库来解析Json. 本文将介绍TouchJso

【转】IOS中Json解析的四种方法

原文网址:http://blog.csdn.net/enuola/article/details/7903632 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSer

XML/JSON解析

JSON: 什么是JSON: 1,json是一种轻量级的数据格式,一般用于数据交互: 2,服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack","rose","jim"]} 标准JSON格式的注意点:key必须

AFNetWorking 简单介(XML,JSON解析和判断网络状态

//AFNetWorking 当下最流行的数据请求方法 里面不仅包含数据请求还包含数据解析 //包含的数据请求就是对系统类NSURLConnection的封装 //数据解析(NSJSONSerialization.XMLParser) //AFNetworking 下至兼容ios6.0 以及block语法 arc //通过AFNetWorking请求json数据 并解析 //<1>创建http请求操作管理者对象 AFHTTPRequestOperationManager * manager =