【原】iOS学习38网络之数据解析

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     // 根据需求的标签获取相关的数据
35     if ([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     
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 {
69     for (Student *stu in self.dataArray) {
70         NSLog(@"name = %@, gender = %@, age = %ld", stu.name, stu.gender, 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文件添加到工程中。

   源文件下载地址 https://github.com/AlonerOwl/XML-

   编译后会出现一个错误