一、定义
1.1 什么是 XML?
- XML 指可扩展标记语言(Extensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义,您需要自行定义标签
- XML 被设计为具有自我描述性
- XML 是 W3C 的推荐标准
1.2 什么是 JSON?
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于编程语言,采用完全独立于编程语言的文本格式来存储和表示数据。JSON 解析器和 JSON 库支持许多不同的编程语言。
- JSON 具有自我描述性,更易理解
二、文件构成
2.1 XML 文档的构建模块
所有的 XML 文档均由以下简单的构建模块构成:元素、属性、实体、PCDATA、CDATA。分别对其说明如下。
- 元素
元素是 XML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。示例:
<body>body text</body>
- 属性
属性可提供有关元素的额外信息。示例:
<img src="computer.gif" />
-
实体
实体是用来定义普通文本的变量。 -
PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
在 DTD 中,指定某个标签中的内容是字符数据时,使用 (#PCDATA)。由于它的内容也是需要解析器来解析的,所以仍然需要转换 >, <, &, ‘, " 这 5 个特殊字符。 例如在 DTD 中声明:<!ELEMENT name (#PCDATA)>
, 它表示在 <name> 和 </name> 标签之间可以插入字符或者子标签。PCDATA 可以是字符串和子元素。 -
CDATA
CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。CDATA 是在 XML 文档里面使用的关键字,用来告诉浏览器,这部分内容不用解析,是给其他程序用的,比如 js 代码等。
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 “<![CDATA[" 开始,由 "]]>” 结束,示例如下:
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>
在上面的例子中,解析器会忽略 CDATA 部分中的所有内容。
注释:CDATA 部分不能包含字符串 “]]>”,也不允许嵌套的 CDATA 部分,标记 CDATA 部分结尾的 “]]>” 不能包含空格或折行。
2.2 JSON 构成
json 由对象(集合)、数组、key/value 元素三部分组成,可以相互嵌套。各部分表示方法如下所示:
- 使用大括号包围的是对象
- 使用中括号包围的是数组
- 冒号分隔的是元素。
元素组成:
- 元素的 key 只能是字符串。
- 元素的 value 数据类型可以是数字(整数或浮点数)、字符串、逻辑值(true 或 false)、数组、对象、null。
三、语法规则
3.1 XML 语法规则
XML 的语法规则很简单,且很有逻辑。这些规则很容易学习,也很容易使用,具体说明如下。
- 所有 XML 元素都须有关闭标签。
注释:您也许已经注意到 XML 声明没有关闭标签。这不是错误。声明不属于 XML 本身的组成部分。它不是 XML 元素,也不需要关闭标签。 - XML 标签对大小写敏感。
注释:打开标签和关闭标签通常被称为开始标签和结束标签。不论您喜欢哪种术语,它们的概念都是相同的。 - XML 必须正确地嵌套。
- XML 文档必须有根元素。
- XML 的属性值须加引号。
- 实体引用。
在 XML 中,一些字符拥有特殊的意义。如果你把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。为了避免这个错误,请用实体引用来代替 “<” 字符。
在 XML 中,有 5 个预定义的实体引用:
注释:在 XML 中,只有字符 “<” 和 “&” 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。 - XML 中的注释。
在 XML 中编写注释的语法与 HTML 的语法很相似,举例如下:
<!-- This is a comment -->
- 在 XML 中,空格会被保留。
- XML 以 LF 存储换行。
“LF” 换行即使用 ‘\n’ 符号表示;还有一种换行 “CR” 换行,即用符号 “\r” 表示,别的语言用 “CR” 换行。
3.2 JSON 语法规则
JSON 语法是 JavaScript 对象表示法语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
四、XML 和 JSON 的区别
XML 的优点:
- 格式统一,符合标准;
- 容易与其他系统进行远程交互,数据共享比较方便。
XML 的缺点:
- XML 文件庞大,文件格式复杂,传输占带宽;
- 服务器端和客户端都需要花费大量代码来解析 XML,导致服务器端和客户端代码变得异常复杂且不易维护;
- 客户端不同浏览器之间解析 XML 的方式不一致,需要重复编写很多代码;
- 服务器端和客户端解析 XML 花费较多的资源和时间。
JSON 的优点:
- 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
- 易于解析,客户端 JavaScript 可以简单的通过 eval() 进行 JSON 数据的读取;
- 支持多种语言,包括 ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby 等服务器端语言,便于服务器端的解析;
- 在 PHP 世界,已经有 PHP-JSON 和 JSON-PHP 出现了,偏于 PHP 序列化后的程序直接调用,PHP 服务器端的对象、数组等能直接生成 JSON 格式,便于客户端的访问提取;
- 因为 JSON 格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
JSON 的缺点:
- 没有 XML 格式这么推广的深入人心和使用广泛,没有 XML 那么通用性;
- JSON 格式目前在 Web Service 中推广还属于初级阶段。
五、XML 和 JSON 格式互转
https://www.bejson.com/xml2json/ 网址可以快速将 XML 和 JSON 进行互转。举例如下。
XML 数据:
<?xml version="1.0" encoding="UTF-8" ?>
<Transfer>
<attribute>Connect</attribute>
<ext>
<id>20013</id>
</ext>
<outer>
<to>15505510628</to>
</outer>
</Transfer>
JSON 数据:
{
"Transfer": {
"attribute": "Connect",
"ext": { "id": "20013" },
"outer": { "to": "15505510628" }
}
}
在线转换结果如下图所示。