ViewController.h文件
#import <UIKit/UIKit.h>
#import "Students.h"
#import "GDataXMLNode.h"
@interface ViewController : UIViewController<NSXMLParserDelegate>
//学生数组
@property(nonatomic,strong)NSMutableArray *stuArray;
//临时变量,记录标签中的值
@property(nonatomic,strong)NSString *tempStr;
@end
ViewController.m文件
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/* //解析的基本概念
//XML数据结构
//JSON数据结构
1.进行XML数据结构解析时使用到SAX工具,DOM工具
2.进行JSON数据结构解析时使用到第三方框架以及系统方法
//解析的基本概念
所谓'解析':从事先规定好的格式中提取数据
解析的前提:提前约定好格式,数据提供方按照格式提供数据,数据获取方则按照格式获取数据
iOS开发常见的解析:XML解析、json解析
XML数据结构
xml:Extensibale Markup Language(可扩展标记语言)
主流数据格式之一,可以用来存储和传输数据
SAX:Simple APi for XML. 基于事件驱动的解析方式,逐行解析数据(采用协议回调机制)
DOM:Document Object Model(文档对象模型). Dom方式解析XML时,读入整个xml文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值.而且通常情况下,可以借助Xpath,直接查询XML节点.
*/
}
#pragma -mark sax解析
- (IBAction)SAXButton:(id)sender {
//1.获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//2.转成数据
NSData *data = [NSData dataWithContentsOfFile:path];
//3.创建解析类
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//4.授权
parser.delegate = self;
//5.开始解析
[parser parse];
}
#pragma -mark sax解析的代理方法
//发现标签开始处理函数(即报告元素的开始以及元素的属性)
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
//当发现student节点的时候初始化数组准备装学生
if ([elementName isEqualToString:@"students"]) {
_stuArray = [NSMutableArray array];
}
//当发现学生的时候,创建一个学生对象并加入数组
else if ([elementName isEqualToString:@"student"])
{
Students *stu = [[Students alloc] init];
[_stuArray addObject:stu];
}
}
//记录临时变量:处理标签包含内容字符(报告标签的所有或者部分内容)
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//临时变量记录节点内容
self.tempStr = string;
}
//发现标签结束符的处理函数,保存标签各项数据(即报告标签的结束标记)
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//从数组中取出学生 赋值
Students *stu = [_stuArray lastObject];
//赋值
// if ([elementName isEqualToString:@"name"]) {
// stu.name = _tempStr;
// }else if ([elementName isEqualToString:@"sex"])
// {
// stu.sex = _tempStr;
// }else if ([elementName isEqualToString:@"number"])
// {
// stu.number = _tempStr;
// }else
// {
// stu.phone = _tempStr;
// }
//
//kvc赋值
//可以用kvc赋值(要在students对象中添加一个方法)
//-(void)setValue:(id)value forUndefinedKey:(NSString *)key
[stu setValue:_tempStr forKey:elementName];
}
//解析完成(报告解析的结束)
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"解析完成");
for (Students *stu in _stuArray) {
NSLog(@"%@",stu.name);
}
}
#pragma -mark Dom解析
- (IBAction)DomButton:(id)sender {
//Dom解析需要以下几个步骤:
//1.header search path 中添加${SDKROOT}/usr/include/libxml2
//2.添加libxml2依赖库
//3.mrc转arc 在Build Phases 的compile Sources 中添加进来的文件后面加上 -fno-objc-arc
//1.获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//2.转NSData
NSData *data = [NSData dataWithContentsOfFile:path];
//3.数组初始化
_stuArray = [NSMutableArray array];
//装载数据(把完成的data丢到内存)
GDataXMLDocument *docuemnt = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
//获取根节点
GDataXMLElement *rootElement = [docuemnt rootElement];
//获取子节点
NSArray *array = [rootElement elementsForName:@"student"];
//遍历数组获取数据
for (GDataXMLElement *element in array) {
Students *stu = [[Students alloc] init];
//赋值(需要强转)
stu.number = [[[element elementsForName:@"number"] lastObject] stringValue];
stu.sex = [[[element elementsForName:@"sex"] lastObject] stringValue];
stu.phone = [[[element elementsForName:@"phone"] lastObject] stringValue];
stu.name = [[[element elementsForName:@"name"] lastObject] stringValue];
[_stuArray addObject:stu];
}
for (Students *stu in _stuArray) {
NSLog(@"%@",stu.name);
}
}
#pragma -mark JSON解析
- (IBAction)JsonButton:(id)sender {
//获取要解析的文件路径
//将文件转化成数据类型(NSData)
//解析
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student1" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
//解析
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%ld",[array count]);
//初始化学生数组
NSMutableArray *array1 = [NSMutableArray array];
//遍历数组取出学生
for (NSMutableDictionary *dic in array) {
Students *stu = [[Students alloc] init];
[stu setValuesForKeysWithDictionary:dic];
[array1 addObject:stu];
}
for (Students *stu in array1) {
NSLog(@"%@",stu.name);
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
UI数据解析(Dom,Sax,Json)
最新推荐文章于 2024-07-15 21:52:20 发布