1、XML简介
XML即可扩展标记语言(eXtensible Markup Language)。标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等。
XML就是一种数据的描述语言,虽然它是语言,但是通常情况下,它并不具备常见语言的基本功能——被计算机识别并运行。只有依靠另一种语言,来解释它,使它达到你想要的效果或被计算机所接受。
1)XML是一种标记语言,很类似HTML
2)XML的设计宗旨是传输数据,而非显示数据
3)XML标签没有被预定义。您需要自行定义标签。
4)XML被设计为具有自我描述性。
5)XML是W3C的推荐标准
XML是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
2、XML与HTML的区别
1)XML不是HTML的替代。
2)XML和HTML为不同的目的而设计。
3)XML被设计为传输和存储数据,其焦点是数据的内容。
4)HTML被设计用来显示数据,其焦点是数据的外观。
5)HTML旨在显示信息,而 XML 旨在传输信息
6)XML不是对HTML的替代
XML仅仅是纯文本而已。有能力处理纯文本的软件都可以处理XML。使用XML 的应用程序可以有针对性地处理 XML 的标签。标签的功能性意义依赖于应用程序的特性。
3、XML CDATA
所有XML文档中的文本均会被解析器解析。
只有CDATA区段(CDATA section)中的文本会被解析器忽略。被<![CDATA[]]>
这个标记所包含的内容将表示为纯文本。在处理有些特殊数据时这个这个标记很有用。
如在 XML 元素中,”<” 和 “&” 是非法的。
“<” 会产生错误,因为解析器会把该字符解释为新元素的开始。 “&” 也会产生错误,因为解析器会把该字符解释为字符实体的开始。
某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。
例如,
<Item>
<YEAR>
<![CDATA[ 1>2 ]]>
</YEAR>
<CITING>
<![CDATA[ &51 ]]>
</CITING>
</Item>
4、XML 解析
1)C/C++中使用pugixml解析
pugixml是一个很棒的XML操作库,它很轻量,只有三个文件(pugiconfig.hpp pugixml.cpp pugixml.hpp )
- 支持Unicode
- 支持XPATH解析
- 速度快,仅比RapidXml慢一些
- 跨平台(windows/linux)
- 面向对象
2)JAVA中可使用DOM、SAX、DOM4J 或JDOM等解析
DOM形成了树结构,直观好理解,代码更易编写。解析过程中树结构保留在内存中,方便修改。当xml文件较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出。
SAX采用事件驱动模式,对内存耗费比较小。适用于只需要处理xmI中数据时。但不易编码,很难同时访问同一个xml中的多处不同数据。
DOM4J 是一个非常非常优秀的Java XML API,将整个文档读入,然后解析,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。
JDOM是基于树的处理XML的Java API,把树加载在内存中,没有向下兼容的限制,因此比DOM简单速度快,缺陷少具有SAX的JAVA规则
,但不能处理大于内存的文档,JDOM表示XML文档逻辑模型。不能保证每个字节真正变换。针对实例文档不提供DTD与模式的任何实际模型。不支持与DOM中相应遍历包。
3)Python中可使用DOM、SAX、ElementTree、ElementTree.iterparse等解析
整体效率:DOM < SAX < ElementTree < ElementTree.iterparse
4).NET中可以使用XmlDocument和XmlReader解析
XMLReader 提供对 XML 数据进行快速、非缓存、只进访问的读取器。XMLReader 只能读取xml文件,需要我们自己控制怎样获取相应的xml节点的信息,适合于读取很大的xml文件。 XMLDocument 表示XML文档在内存中的树形结构,它提供像js操作html文档一样的方式操作XML文档。在读取单个小XML文件时效率比较高。 DataSet 类型提供了一个ReadXml 方法,它将XML架构和数据读入DataSet中。DataSet 在读取 XML 文件时效率很低。
5、JSON简介
JSON:JavaScript对象表示法(JavaScript Object Notation), 是一种轻量级的数据交换格式, 易于人阅读和编写, 同时也易于机器解析和生成。
JSON是存储和交换文本信息的语法,类似XML。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
6、JSON格式
JSON构建于两种结构:
1)“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array)。
2)值的有序列表(An ordered list of values)。在大多数语言中,它被理解为数组(array)、矢量(vector), 列表(list)或者是序列(sequence)。
JSON具有以下这些形式:
对象是一个无序的“’名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由0到多个Unicode字符组成的序列,封装在双引号(”“
)中, 可以使用反斜杠(\
)来进行转义。一个字符可以表示为一个单一字符的字符串。
数字(number)类似C或者Java里面的数,没有用到的8进制和16进制数除外。
例如,
{ "code": 1, "data": 0, "albumIdList": [ { "totalidnum": 2000, "idlist": [ "319281600" ] } ], "albumArray": { "319281600": { "_as": "", "_blk": 0, "_cid": 1, "_ct": "2014-10-10 17:55:06", "_da": "", "_dl": 0, "_dn": "7296", "_id": 319281600, "_img": "http://pic2.qiyipic.com/image/20141016/19/ca/v_108628048_m_601_m1_120_160.jpg", "_ip": 1, "_ma": "", "_pc": 2, "_pid": 0, "_reseftv": 959, "_t": "末代独裁", "_tvct": 1, "_tvs": 1, "_vt": 0, "a_av": 1, "a_pro": "", "bpt": "0", "clm": "", "cn_year": "0", "co_album_id": "0", "ctype": 0, "desc": "", "down": 0, "down2": "0", "drm": 0, "fst_time": "2014-10-16", "h1_img": "http://pic2.qiyipic.com/image/20141016/19/ca/v_108628048_m_601_m1_180_236.jpg", "h2_img": "http://pic2.qiyipic.com/image/20141016/19/ca/v_108628048_m_601_m1_195_260.jpg", "is_h": 0, "is_n": 0, "is_zb": 0, "k_word": "", "language": 0, "live_center": 0, "live_start_time": 0, "live_stop_time": 0, "logo": 1, "m_av": 1, "p_av": 1, "p_s": 0, "p_s_1": 0, "p_s_4": 0, "p_s_8": 0, "qiyi_pro": 0, "qiyi_year": "0", "qt_id": "1005722", "s_TT": "", "songname": "", "t_pc": 1, "tag": "当代 美国 乡村 大片", "tv_eftv": 1, "tv_pha": "", "tv_pro": "", "tv_ss": "", "tvfcs": "雄心壮志背后的真相", "up": 0, "up2": "0", "upcl": "", "v2_img": "http://pic2.qiyipic.com/image/20141016/19/ca/v_108628048_m_601_m1_284_160.jpg", "v3_img": "http://pic2.qiyipic.com/image/20141016/19/ca/v_108628048_m_601_m1_480_270.jpg", "vv": "1", "year": "2007", "tv_id": "0", "vv_p": 0, "vv_f": 2, "vv_m": 0, "_sc": 8 } }, "changeAlbum": null, "category": null, "before": "2~4~1~7~3", "latest_push_id": "655", "up_tm": "1413441370874", "recommend_attach": "", "preset_keys": null, "category_group": null, "exp_ts": 120, "stfile_path": "/data/view/online5/0/1/2.1.8.5.1.txt" }
7、JSON的解析
1)C/C++ 使用JsonCpp解析
jsoncpp 主要包含三种类型的 class:Value、Reader、Writer。jsoncpp 中所有对象、类名都在 namespace Json 中,包含 json.h 即可。Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。
2)JAVA 使用FastJSON、Gson或Jackson等解析
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式。json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,
3)Python 使用json库或Demjson第三方库等解析
使用 JSON 函数需要导入 json 库:import json。Demjson 是 python 的第三方模块库,可用于编码和解码 JSON 数据,包含了 JSONLint 的格式化及校验功能。
4).NET 使用System.Runtime.Serialization.Json、System.Web.Script.Serialization或Newtonsoft.Json解析
.NET Framwork3.5自带的System.Runtime.Serialization.Json可很好的完成JSON的解析,不需要使用第三方库。System.Web.Script.Serialization(System.Web.Extensions.dll)是Web项目中直接直接使用解析JSON,Json.NET即Newtonsoft.Json。大多数人都会选择性能以及通用性较好Json.NET,不是微软的类库,但是一个开源的很流行的Json操作类库,性能比较好,使用也很方便。
8、XML和JSON区别
XML主要是由element、attribute和element content组成。JSON主要是由object、array、string、number、boolean(true/false)和null组成。
XML要表示一个object(指name-value pair的集合),最初可能会使用element作为object,每个key-value pair 用 attribute 表示。
XML需要选择怎么处理element content的换行,而JSON string则不须作这个选择。
XML只有文字,没有预设的数字格式,而JSON则有明确的number格式,这样在locale上也安全。
XML映射数组没大问题,就是数组元素tag比较重复冗余。JSON 比较易读。
JSON的true/false/null也能容易统一至一般编程语言的对应语义。
XML文档可以附上DTD、Schema,还有一堆的诸如XPath之类规范,使用自定义XML元素或属性,能很方便地给数据附加各种约束条件和关联额外信息,从数据表达能力上看,XML强于Json,但是很多场景并不需要这么复杂的重量级的东西,轻便灵活的Json就显得很受欢迎了。