解析的基本概念
解析: 从事先规定好的格式中提取数据
解析的前提: 提前约定好格式,数据提供方按照格式提供数据,数据获取方则按照格式获取数据
iOS开发常见的解析: XML解析,JSON解析
- XML: Extensible Markup Language (可扩展标记语言),主流数据格式之一,可用来存储和传输数据
(Plist文件就是用XML格式存储数据的)
XML
- XML数据格式的功能:
- 数据交换
- 内容管理
- 用作配置文件
- XML数据结构的语法
- 声明
- 节点使用一对标签表示:起始和结束标签
- 根节点是起始节点,只有一个,节点可以嵌套
- 节点可以有值,存储在一对标签中.
SAX工具:
SAX : Simple API for XML. 基于事件驱动的解析方式,逐行解析数据.(采用协议回调机制)
- NSXMLParser:
- NSXMLParser是iOS自带的XML解析类,采用SAX方式解析数据
- 解析过程由NSXMLParserDelegate协议方法回调
- 解析过程: 开始标签->取值->结束标签
#import
"ViewController.h"
#import "Student.h"
//NSXMLParserDelegate 协议是 iOS 中使用系统的 SAX 解析使用的协议
@interface ViewController ()<</span>NSXMLParserDelegate>
//数据源数组
@property (nonatomic, strong) NSMutableArray *dataArray;
//接收标签的名字
@property (nonatomic,strong) NSString *currentElement;
@end
@implementation ViewController
- (void)viewDidLoad {
}
//触摸方法
- (void)touchesBegan:(NSSet<</span>UITouch *> *)touches withEvent:(UIEvent *)event{
}
//开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser{
}
// 检测开始标签
// 参数 1: 类
// 参数 2: element 标签的名字
// 以下三个基本不会使用到 , 基本为 nil
// 参数 3: 节点里面的命名空间 (xmlns)
// 参数 4: qName
// 参数 5: attributeDict 标签的属性
- ( void )parser:( NSXMLParser *)parser didStartElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName attributes:( NSDictionary <</span>NSString *,NSString *> *)attributeDict{
//(2)如果标签的名字是student则表示 要创建一个model,并添加到数据源数组里面
// 检测开始标签
// 参数 1: 类
// 参数 2: element 标签的名字
// 以下三个基本不会使用到 , 基本为 nil
// 参数 3: 节点里面的命名空间 (xmlns)
// 参数 4: qName
// 参数 5: attributeDict 标签的属性
- ( void )parser:( NSXMLParser *)parser didStartElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName attributes:( NSDictionary <</span>NSString *,NSString *> *)attributeDict{
}
// 检测到标签中的值
// 参数 1: 类
// 参数 2: 值
- ( void )parser:( NSXMLParser *)parser foundCharacters:( NSString *)string{
}
//
检测结束标签(注 : 遇到开始标签和结束标签都会运行一次)
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
}
// 结束解析文档
// 结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser{
}
@end
DOM工具:
GDataXMLNode :
- 采用DOM方式解析数据
- iOS包含一个C语言的动态链接库libxml2.tbd,解析熟读比NSXMLParser快.
- GDdataXMLNode是Google提供的XML解析类, 对libxml2.tbd(xcode7以前是 .dylib)进行了Objective-C的封装,能对较小或中等的xml文档进行读写操作且支持Path语法.
使用方法:
- 获取GDataXMLNode.h /.m 文件,将GDataXMLNode.h /.m文件添加到工程中.
- 向工程中增加”libxml2.tbd”动态库
- 在工程的”Build Settings”页中找到”Header Search Path”项,添加 "/usr/include/libxml2 "
- 导入”GDataXMLNode.h / .m” 文件到头文件中,如工程能编译通过,则说明GDataXMLNode添加成功.
属性和方法:
#import
"SecondViewController.h"
//DOM 解析
#import "GDataXMLNode.h"
#import "Student.h"
@interface SecondViewController ()
@property ( nonatomic , strong ) NSMutableArray *dataArray;
@end
@implementation SecondViewController
- ( void )viewDidLoad {
[
super
viewDidLoad
];
self
.
view
.
backgroundColor
= [
UIColor
blueColor
];
self
.
dataArray
= [
NSMutableArray
array
];
}
- ( void )touchesBegan:( NSSet <</span>UITouch *> *)touches withEvent:(UIEvent *)event{
//获取XML_stu.txt文档并且转化为NSData
NSString *path = [[NSBundle mainBundle]pathForResource:@"XML_stu.txt" ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:path];
NSError *error = nil;
//GDataXMLDocument XML的DOM解析使用的类
//参数 1: 解析的data对象
//参数 2: 一般就是0
//参数 3: error信息
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:&error];
//获取到XML数据的根节点
//获取到根节点里面所有的东西,也就是说获取到students里面包含的所有东西 也就是说 获取到students里面包含的所有
GDataXMLElement *rootElement = [document rootElement];
NSLog(@"rootElement --> %@",rootElement);
for (GDataXMLElement *subElement in rootElement.children) {
//这里获取到的subElement保存的是student标签里面的内容,所以在这里创建对象
NSLog(@"subElement --> %@",subElement);
Student *student = [Student new];
for (GDataXMLElement *element in subElement.children) {
NSLog(@"%@",element);
//element 保存的就是student标签的所有子标签
//根据标签的名字 给属性赋值
//element.name 表示标签名字
//element.stringValue表示标签的值
if ([element.name isEqualToString:@"name"]) {
student.name = element.stringValue;
}
if ([element.name isEqualToString:@"gender"]) {
student.gender = element.stringValue;
}
if ([element.name isEqualToString:@"age"]) {
student.age = [element.stringValue integerValue];
}
if ([element.name isEqualToString:@"hobby"]) {
student.hobby = element.stringValue;
}
}
[self.dataArray addObject:student];
}
for (Student *student in self.dataArray) {
NSLog(@"%@ %@ %ld %@",student.name,student.gender,student.age,student.hobby);
}
}
//DOM 解析
#import "GDataXMLNode.h"
#import "Student.h"
@interface SecondViewController ()
@property ( nonatomic , strong ) NSMutableArray *dataArray;
@end
@implementation SecondViewController
- ( void )viewDidLoad {
}
- ( void )touchesBegan:( NSSet <</span>UITouch *> *)touches withEvent:(UIEvent *)event{
}
@end
XML的优缺点:
- 格式统一,符合标准
- 容易与其他系统进行远程交互,数据共享比较方便
- XML文件格式文件庞大, 格式复杂, 传输占用带宽.
- 服务器端和客户端都需要花费大量代码来解析XML,不论服务器端还是客户端都使用代码变得异常复杂和不容易维护
- 客服端不容浏览器之间解析XML的方式不一致,需要重复编写很多代码
- 服务器端和客户端解析XML花费资源和时间
Parser : n. [计] 分析程序;语法剖析程式
Bundle
:
n. 束;捆
current : adj. 现在的;流通的,通用的;最近的;草写的
element : n. 元素;要素;原理;成分;自然环境
attribute: n.属性,特质