数据解析之XML和JSON
1. 解析的基本的概念
解析:从事先规定好的格式中提取数据
解析前提:提前约定好格式,数据提供⽅按照格式提供数据、数据获取⽅则按照格式获取数据
iOS开发常见的解析:XML解析、JOSN解析
2. XML数据结构
1> 概述
XML:Extensible markup language(可扩展标记语⾔),主流数据格式之⼀,可以⽤来存储和传输数据。
2> XML数据格式的功能
数据交换
内容管理
⽤作配置⽂件
3> XML数据格式的语法
声明
节点使⽤⼀对标签表⽰:起始和结束标签。
根节点是起始节点,只有⼀个,节点可以嵌套。
节点可以有值,存储在⼀对⼉标签中。
4> XML实例
3. 使⽤SAX⼯具解析XML
1> 概述
Simple API for XML。基于事件驱动的解析⽅式,逐⾏解析数据。(采⽤协议回调机制)
2> NSXMLParser类概述
NSXMLParser是iOS⾃带的XML解析类,采⽤SAX⽅式解析数据
解析过程由NSXMLParserDelegate协议⽅法回调
解析过程:开始标签 --> 取值 --> 结束标签 --> 取值
3> 初始化NSXMLParser
使⽤NSXMLParser要先创建它,设置各种属性,主要⽤到⼀下⼏个⽅法:
4> NSXMLParserDelegate代理⽅法
5> 代码
1#pragma mark - SAX解析xml⽂件
2 - (IBAction)saxParserActionXMLDocument:(UIButton *)sender
3 {
4// 1. 获取⽂件路径(获取xcode中的⽂件路径)
5 NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_XML" ofType:@"txt"];
6
7// 2. 获取NSData类型的数据
8 NSData *data = [NSData dataWithContentsOfFile:path];
9
10 NSLog(@"data = %@", data);
11
12// 3. 设置SAX解析,并关联相关的xml⽂件
13 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
14
15// 4. 设置代理
16 parser.delegate = self;
17
18// 5. 开始解析
19 [parser parse];
20 }
21
22
23#pragma mark NSXMLParserDelegate的协议⽅法
24
25#pragma mark 1. ⽂档解析
26 - (void)parserDidStartDocument:(NSXMLParser *)parser
27 {
28
29 }
30
31#pragma mark 2. 开始标签解析
32 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
33 {
34// 根据需求的标签获取相关的数据
35if ([elementName isEqualToString:@"student"]) {
36 Student *stu = [Student new];
37
38// 在这⾥不需要赋值
39
40// 将数据对象添加到数组中
41 [self.dataArray addObject:stu];
42 }
43
44// 将当前的标签值传给声明的标签属性
45 self.currentElement = elementName;
46
47 }
48
49#pragma mark 3. 解析标签中的内容然后赋值给对象
50 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
51 {
52// 从数组中取出相关的Student对象,每次取数组中最后的⼀个元素,保证值为最新的对象内容
53 Student *stu = [self.dataArray lastObject];
54
55// KVC
56 [stu setValue:string forKey:self.currentElement];
57
python处理xml文件58 }
59
60#pragma mark 4. 结束标签
61 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
62 {
63 self.currentElement = nil;
64 }
65
66#pragma mark 5. 结束⽂档解析
67 - (void)parserDidEndDocument:(NSXMLParser *)parser
68 {
69for (Student *stu in self.dataArray) {
70 NSLog(@"name = %@, gender = %@, age = %ld", stu.name, der, stu.age);
71 }
72 }
73
74#pragma mark 6. 错误处理
75 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
76 {
77 NSLog(@"error = %@", parseError);
78 }
79
80 - (void)viewDidLoad {
81 [super viewDidLoad];
82// Do any additional setup after loading the view, typically from a nib.
83 }
84
85 - (void)didReceiveMemoryWarning {
86 [super didReceiveMemoryWarning];
87// Dispose of any resources that can be recreated.
88 }
4. 使⽤DOM⼯具解析XML
1> 概述
DOM:Document Object Model(⽂档对象模型)。DOM⽅式解析XML时,读⼊整个XML⽂档并构建⼀个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。⽽且通常情况下,可以借助XPath,直接查询XML节点。
2> GDataXMLNode概述
采⽤DOM⽅式解析数据
iOS中包含⼀个C语⾔的动态链接库libxml2.dylib(xcode7以后改为libxml2.tbd),解析速度⽐NSXMLParser快。
GDataXMLNode是Google提供的开源XML解析类,对libxml2.tbd进⾏了Objective-C的封装,能对较⼩或中等的xml⽂档进⾏读写操作且⽀持XPath语法。
3> GDataXMLNode使⽤⽅法
获取GDataXMLNode.h/m⽂件,将GDataXMLNode.h/m⽂件添加到⼯程中。
编译后会出现⼀个错误
这是因为没有进⾏配置,朋友们不需要紧张,往下看配置。
向⼯程中增加“libxml2.tbd”动态库。
在⼯程的“Build Settings”页中到“Header Search Path”项,添加/usr/include/libxml2”。
在⼯程的“Build Settings”页中到“Other Linker Flags”项,添加“-lxml2”。
进⾏完配置后,编译后仍会出错
这个错误是因为⾮ARC⽂件在ARC的环境运⾏时的常见错误,解决办法:在 Build Phases 的 Compile Sources 中到⾮ARC⽂件对应的 .m ⽂件, 将Compiler Flags 的值设为 -fno-objc-arc
4> GDataXMLElement类的⽅法
5> 代码
1#pragma mark - DOM解析xml⽂件
2 - (IBAction)domParserActionXMLDocument:(UIButton *)sender
3 {
4// 第⼀步:引⼊动态库
5
6// 1. 获取⽂件的路径
7 NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_XML" ofType:@"txt"];
8
9// 2. 根据路径获取数据
10 NSData *data = [NSData dataWithContentsOfFile:path];
11
12// 3. 设置DOM解析(创建解析⽂档)
13// 第⼀个参数为数据
14// 第⼆个参数为选择项,是⼀个int型的值,⼀般为 0
15 GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
16
17// 4. 获取根节点
18 GDataXMLElement *rootElement = Element;
19
20// 5. 遍历获取相对应的⼦节点
21for (GDataXMLElement *studentElement in rootElement.children) {
22
23 Student *stu = [Student new];
24// 遍历⼦节点的⼦节点
25for (GDataXMLElement *propertyElement in studentElement.children) {
26// NSLog(@"%@", propertyElement);
27
28// 根据标签给student赋值
29// propertyElement.name 标签的名字
30// propertyElement.stringValue 标签的值
31
32// kvc
33 [stu setValue:propertyElement.stringValue forKey:propertyElement.name];
34 }
35
36 [self.dataArray addObject:stu];
37 }
38
39for (Student *stu in self.dataArray) {
40
41 NSLog(@"name = %@, gender = %@, age = %ld", stu.name, der, stu.age);
42 }
43 }
5. JOSN数据结构
1> 概述
JSON(JavaScript Object Notation) 是⼀种轻量级的数据交换格式。JSON采⽤完全独⽴于语⾔的⽂本格式,易于阅读和编写,同时也易于机器解析和⽣成。这些特性使JSON成为理想的数据交换语⾔。
2> JSON数据结构的语法
JSON⽂件有两种结构:
对象:“名称/值”对的集合。不同的语⾔中,它被理解为对象,记录,结构,字典,哈希表,有键列表,或者关联数组。以“{”开始,以“}”结束,是“名称/值”对的集合。名称和值中间⽤“:”隔开。多个“名称/值”对之间⽤“,”隔开。
数组:值的有序列表。在⼤部分语⾔中,它被理解为数组。以“[”开始,以“]”结束,中间是数据。数据以“,”分隔。
JSON中的数据类型:字符串、数值、BOOL、对象、数组。
3> JSON⽰例
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论