一   解析
二 XML数据结构
三 JSON 数据结构
 
 
一 解析
1  定义: 从事先规定好的格式中提取数据
    解析的前提:提前约定好格式,数据提供方按照格式提供数据、数据获取方则按照格式获取数据
 
2  主流的数据交换格式有两种:XML 、JSON
3  iOS 开发常见的解析 :
3.1  XML 解析 :SAX 解析和DOM 解析
       XML 解析工具:NSXMLParser、GDataXMLNode、TouchXML 和 KissXML 等
3.2 JSON 解析
解析工具:JSONKit、NSJSONSerialization、TouchJSON和SBJSON等,其中NSJSONSerialization(系统提供的解析类,性能最好的,解析效率最高)
 
二 XML数据结构
----XML------
1 可扩展标记语言(eXtensible Markup Language):存储数据和传送数组
2 跟 JSON 解析一样,常用于交互数据格式
3 一般 XML 文档 (XML Document)
4 举例 :
    <student> 【标签,表示开始】
        <name>你</name>
        <hobby>女</hobby>
    </student> 【标签,表示结束】
5 XML 文档的语法:
5.1 文档声明:在 XML 文档最前面,必须写一个文档声明
    a 最简单的声明 :<?xml version = "1.0"?>
    b 用encoding 属性,来说明文档字符编码:<?xml version = "1.0" encoding = "UTF-8"?>
5.2 元素(Element):一个元素,会包含一个开始标签和一个结束标签
    a 有所有内容:<name>你</name>
    b 无元素内容:<name></name>
    而且一个元素可嵌套若干个子元素,但不能出现交叉嵌套
<students>
    <student> 【标签,表示开始】
        <name>你</name>
        <hobby>女</hobby>
    </student> 【标签,表示结束】
<stdudents>
    ** 注意 : 1 规范的 XML 文档最多只有一个根元素,其他的都是根元素的子孙元素。
              2 在 XML 中,空格和换行,都会被当做具体内容去处理,例如: a和b 是不一样的
                a <name>你</name>
                b <name>
                    你
                  </name>
5.3 属性(Atribute):一个元素可以拥有多个属性,例如
        <video name="小黄人" hobby="apple"/>【video 元素拥有 name,hobby两个属性】
    *注意 : 属性的值必须用 "" 或者 '' 括住
    *属性表示的信息,也可用子元素来表示,例如:
    <video>
        <name>小黄人</name>
        <hobby>apple</hobby>
    </video>
6 对 XML 文档的解析:
    提取 name 元素里面的内容:<name>小黄人</name>
    或者是提取 video 元素中 name 和 hobby 的值 :<video name="小黄人" hobby="apple"/>
7 ---  SAX 解析 ---- Simple API for XML
SAX: 基于事件驱动的解析方式,逐行解析数据(采用协议回调机制)
NSXMLParser 是 iOS 自带的 XML 解析类,采用 SAX 方式解析数据
解析过程由 NSXMLParserDelegate 协议方法回调
<students>
    <student>
        <name>你</name>
        <hobby>女</hobby>
    </student>
</students>
a 解析方式,逐行进行解析。
a.1 打开 XML 文档
a.2 开始节点(开始标签)
a.3 逐行进行解析
a.4 发现元素里面的内容
a.5 提取内容
a.6 结束节点(结束标签)
a.7 循环开始,直到遇到 根元素的结束标签,解析才彻底结束
 
b iOS 中 XML 解析方式有狠多
b.1 苹果原生: NSXMLParser -- SAX 方式解析,使用简单
b.2 第三方框架:
    1 libxm12 : 纯 C 语言,默认被包含进了 iOS SDk
    2 GDataXML :DOM 的解析方式,是由谷歌开发的,底层基于 libxml2
 
 
8 ---DOM 解析----
 
a Document Object Model (文档对象模型),将整个 XML 文档读入,将构建驻留内存的树结果(节点数),通过遍历树结构的任意XML节点,读取它的属性和值,而且通常情况下,可以借助XPath,直接查询 XML 节点
b 步骤:
b.1 获取 GDataXMLNode.h/m 文件,将 GDataXMLNode.m 添加到所需工程
b.2 添加类库 libxml2.tbd 到工程中    libxml2.dylib(iOS7 之前)
b.3 在工程中的“Build settings”页面中找到“Header search path”项,添加 /usr/include/libxml2
b.4 导入 GDataXMLNode.h 文件到头文件中,如编译成功,则 GDataXMLNode 添加成功
 
c 属性和方法
name 取标签名
attributeForName 取属性节点
stringValue 取标签间的字符串
rootElement 子节点
 
三 JSON 数据结构
1 JSON (JavaScript Object Notation) ,轻量级的数据交换格式,是基于 JS 的一个子集,是完全采用独立语言的文本格式,容易阅读和编写,易于机器解析和生成,非常适合于服务器和客户端的交互
2 注意: 标准的JSON格式:Key 必须使用双引号
3 JSON 数据结构的语法
3.1中的数据类型 : 字符串、数值、BOOL、对象、数组
3.2文件中有两种结构:
对象 、数组
3.3 JSON - OC : 两者对应的数据类型
    a JSON 中的大括号 {},在OC 中 NSDictionary
    b JSON 中的方括号 [], 在OC 中表示 NSArray
    c JSON 中的双引号 "", 在OC 中表示 NSString
4 JSON 数据结构的功能
数据交换、内容管理、配置文件
5 在 iOS 中常见的 JSON 解析方式:
 5.1 原声(自带):NSJSONSerialization(性能最好的)
          NSJSONSerialization 里面包含了两个方法来通过不同数据形式解析JSON数据
5.1.1  +JSONObjectWithData: options: error: 使用缓冲区数据解析JSON
5.1.2  +writeJSONObject: toStream: options: error: 使用文件流的行式解析JSON
 5.2 第三方:JSONKit、SBJSON、TouchJSON(依次从左到右,越来越差)
objectFromJSONData
四 XML 与 JSON 两种数据结构的优缺点
1.XML与JSON两种数据结构的优缺点

1> XML
 优点:\u2028

  • 格式统一, 符合标准\u2028

  • 容易与其他系统进行远程交互, 数据共享比较方便

\u2028 缺点:

  • XML文件格式文件庞大, 格式复杂, 传输占用带宽\u2028

  • 服务器端和客户端都需要花费大量代码来解析XML, 不论服务器端和客户端代码变的异常复杂和不容易维护

  • 客户端不同,浏览器之间解析XML的方式不一致, 需要重复编写很多代码\u2028

  • 服务器端 和 客户端 解析XML花费资源和时间

2> JSON
 优点:\u2028

  • 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小\u2028

  • 易于解析这种语言

  • 支持多种语言, 包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析\u2028

  • 因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护\u2028

 缺点:\u2028

  • 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性\u2028

  • JSON格式目前在Web Service中推广还属于初级阶段

2.JSON、XML解析方式的底层实现

 1> XML

  Xml两种解析方式,DOM 和 SAX。

  DOM 需要读入整个XML文档(文档驱动),SAX 是事件驱动的,并不需要读入整个文档,文档的读入过程也就是SAX的解析过程。

  SAX 简单地说就是对XML文档进行顺序扫描,当扫描到 文档 的 开始 与 结束 ,元素(element)的 开始 与 结束 时,就会触发相应的事件处理 函数,由事件处理函数做相应的动作,处理完后继续扫描,直到文档结束,则解析完毕

  DOM 解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许你使用 DOM API 操作 XML 树。也就是说,DOM 会把XML以 树 的形式读取到内存中,然后在通过相应的 API 来操作这个 XML树,从而达到解析XML文件的目的

 2> JSON

  json底层原理 遍历字符串中的字符,最终根据特助字符,比如{},[],:号等进行区分,{}是字典,[]表示的是数组,:号是字典的键和值的分水岭,最后是将json数据转化为字典,然后使用 KVC 将字典转为 model

3 选择推荐

1)对于复杂的数据结构使用XML,简单的数据结构可采用JSON。

2)在互联网应用中数据传输中,提倡使用JSON。

 
3)针对前后端的差异,可以在服务端使用XML,在前端使用JSON,两者之间的转换在服务器端完成。这样可以各取所长
 

数据解析(XML和JSON数据结构)的更多相关文章

  1. IOS 请求数据解析 XML 和 JSON

    好久没写文章了,回忆一下以前的内容记录一下吧. 这一段主要接触的就是数据解析,就说一下数据解析 现在数据解析一般解析两种数据 xml 和 JSON 那就从xml解析说起吧 xml解析需要用到一个类 N ...

  2. boost-使用property_tree来解析xml、json

    property_tree是一个保存了多个属性值的树形数据结构,可以用来解析xml.json.ini.info文件.要使用property_tree和xml解析组件的话需要包含"boost/ ...

  3. Python解析xml与JSON

    xml与json是常用的文件交换格式,常用来表示网页的html则是xml的变种.解析xml和json在web开发中有着重要应用. DOM解析XML 文件对象模型(Document Object Mod ...

  4. ios解析XML和json数据

    解析的基本概念所谓“解析”:从事先规定好的格式串中提取数据解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据iOS开发常见的解析:XML解析.JSON解析 一.XML数 ...

  5. UI:数据的解析XML与JSON

    XML  和  JSON 语言  本篇博客来自互联网参考 XML 和 JSON 的互相转化 有属性的转化为对象,无属性的转化为字符串 节点的顺序性不可逆,XML有顺序,JSON 无顺序 XML 和 J ...

  6. android基础篇------------java基础(11)(文件解析xml and Json )

    一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...

  7. 个人永久性免费-Excel催化剂功能第90波-xml与json数据结构转换表格结构

    在网络时代,大量的数据交互以xml和json格式提供,特别是系统间的数据交互和网络WebAPI.WebService接口的数据提供,都是通过结构化的xml或json提供给其他应用调用返回数据.若能提供 ...

  8. c# json数据解析——将字符串json格式数据转换成对象

    网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过例子由易到难总结一下处理过程,希望能帮到和我一样开始不会的朋 ...

  9. Flex与Java交互(Flex调用java类展示数据)解析xml展示数据

    Flex与java通信最简单例子(详细说明了各种需要注意的配置):http://blog.csdn.net/u010011052/article/details/9116869 Flex与java通信 ...

随机推荐

  1. Javascript中String()与new String()的差异

    这里主要关注的是值类型和引用类型. 我们知道在javascript中的变量在内存中的存储有两种形式,值类型存储和引用类型存储. 通常可以进行值存储的包括  字符串类型,布尔值类型,数字类型,他们都包含 ...

  2. 面试复习(C++)之直接选择排序

    #include <iostream> using namespace std; void Selection(int *a,int len) { ;i<len;i++) { int ...

  3. 使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)

    函数格式 scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simp ...

  4. 抛弃msvcrtXX库

    对于极致要求体积的程序来说.抛弃Msvcrt里的函数是必要的.(尤其是msvcrtXX库)因为要使用mscvrt中的函数,就需要带上相对来 说,不能容忍的几kb的,vcrt初始化函数,包围在我们的Wi ...

  5. MS SQL提示列名 'Y' 无效的原因及解决办法

    在作项目写MS SQL 存储过程时,需拼接SQL语句字符串,其中有单字符变量,如下图: 如上图执行存储过程是提示“列名‘Y’无效”.经反复测试,原因在用单字符变量连接SQL字符串是必须在引用变量前后各 ...

  6. android-studio的gradle plugin配置相关的一些记录

    感觉就是越高的Gradle版本对应的plugin越高. 你妹的,是不是2.10版本低于2.2版本,我还以为是2.10版本高于2.8.2.9版本呢.每次用2.10版本构建,用1.2.2等都不行.提示最低 ...

  7. Python时区转换

    最近工作中遇到了一个问题:我的server和client不是在一个时区,server时区是EDT,即美国东部时区,client,就是我自己的电脑,时区是中国标准时区,东八区.处于测试需要,我需要向se ...

  8. 初步了解JPA

    想当初07.08年的时候,毕业之季,正思考着离开学校要去做什么工作.为了有一份薪资不错,可以长久发展,也正是自己喜欢的行业.于是乎决定投身于计算机行业.当年正是JAVA的火热时期.到处都是JAVA培训 ...

  9. Go语言http包Form解析之坑

    最近正在用Go语言做一个项目,今天在用http包读取客户端发过来的POST数据时遇到了一点小麻烦,就下面这段代码,死活读不到数据: { var body []byte nRead, err := r. ...

  10. IOS自定义日历控件的简单实现(附思想及过程)

    因为程序要求要插入一个日历控件,该空间的要求是从当天开始及以后的六个月内的日历,上网查资料基本上都说只要获取两个条件(当月第一天周几和本月一共有多少天)就可以实现一个简单的日历,剩下的靠自己的简单逻辑 ...