XML&JSON&YAML
引言
XML也好,JOSN、YAML也好,本质上都是文本文件,用于数据传输。它们与txt这种文本文件的区别是,它们规范了数据格式,使得数据具有结构性,方便读取和处理。XML、JSON、YAML的不同之处只是它们规定的数据格式不同,即语法不同。
XML
XML定义
XML是可扩展性标记语言。
发明XML的目的是传输和存储数据,而非展示数据。
XML的标签只能自定义。
XML主要用途有三个:
- 数据传输
- 用作配置文件
- 充当小型数据库存储数据
XML语法
XML基本语法
如下为一个基本的xml文件,其基本规则有:
- 标签全部自定义,myroot, user, msg等标签全部自定义
- 标签成对出现,格式为<tag></tag>,其中两个尖括号之间是具体的内容信息,成对标签含义是这两个标签唯一的区别就是后边那个有"/",其它完全一致,比如<tag></mytag>这样是不对的。
- 必须有根标签(根节点),比如这里的<myroot></myroot>,根标签包括了所有内容,根标签也是自定义的
- 标签名大小写敏感
- 标签不允许交叉,比如<a><b></a></b>这样是不对的,只能是一对标签完全包含另一对标签。
- xml注释用把要注释的内容括起来
<?xml version="1.0" encoding="utf-8" ?>
<myroot>
<user>中国</user>
<msg>睡狮渐已醒</msg>
`<!--<msg>睡狮渐已醒</msg11>-->`
</myroot>
- 上边第一行是头声明,声明了xml的版本的文件编码,这一行可以省略。
- 如果标签中的信息包含了<>等特殊字符,则需要使用实体转义,如下表为需要转义的字符:
XML属性
属性是标签的属性,比如下图中name标签的属性age。
- 一个标签可以有多个属性,属性的值必须用引号括起来
- 属性表示标签的一些额外信息
- xml中属性没啥用,而且会给解析带来麻烦
CDATA
如果某个标签中的内容有许多需要转义的部分,那么一个个用实体转义会非常麻烦,这个时候可以用CDATA来括起来这部分,比如<,>等符号,使得其不被解析成xml的内容,而保持原样。
格式是
<![CDATA[这里放不解析的内容]]>
JSON
JSON定义
相比于XML,JSON是一种更轻量级的数据传输格式,易于机器解析和生成。
JSON数据格式
XML中有标签,属性等一系列格式,JSON的数据格式有两种,即数组和对象,且二者可以相互嵌套。
JSON数组格式
JSON数组格式用方括号[]包括,其中元素用逗号分开,数组元素类型不做限制。
[1, 2, 3]
JSON对象格式
JSON对象格式用花括号{}括起来,其中的元素是键值对,本质与python中的字典一样。
如下例子,是JSON数组和对象的嵌套使用。
{"key":[1,2,3]}
JSON语法规则
JSON值可以是:
- 数字
- 字符串(双引号中)
- 逻辑值(true或false)
- 数组(在中括号中)
- 对象(在花括号中)
- null
一般情况下json文件中包含的都是一个对象(即键值对),但是只包含一个数组也是允许的。这与XML必须有根节点不同。
python&json
python2.6以上内置了json解释库,直接import json即可使用。
import json
with open("t.json") as fp:
config = json.load(fp)
print(type(config), config)
json.load()会根据json文件的具体内容确定返回dict还是list。
json文件中只有对象
{
"name": "Tom"
}
此时输出:
<class 'dict'> {'name': 'Tom'}
json文件中只有数组
[1, 2, 3]
此时结果为:
<class 'list'> [1, 2, 3]
YAML
JSON相比于XML更简洁,YAML相比于JSON更简洁。比较明显的一点是,XML中标签必须是成对的,而JSON中不需要。JSON中会使用很多的花括号和方括号,YAML则可以连这些都省去。
YAML语法规则
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 空格数不重要,只要对齐即可
- #表示注释
YAML支持的数据类型:
- 对象,即键值对集合,又称为哈希,映射,字典
- 数组
- 纯量
YAML对象中的键值对用冒号分隔,且冒号后有一个空格。如果一个对象里只有一个键值对,那么可以不用花括号。
YAML中数组可以用-开头的行表示,也可以按传统方式,所有元素放在中括号中。
- YAML可以用&和来做引用,&用来标识可以引用的地方,用来在具体的位置引用。
python&YAML例子
首先需要安装PyYaml
import yaml
with open("config.yaml") as fp:
config = yaml.load(fp)
print(type(config), config)
yaml.load是将yaml解码为python对象。
yaml.load(fp)会根据yaml文件的具体内容返回不同类型的值,要么是返回一个list,要么是返回一个dict,根据返回值的类型来使用解析后的对象config。
yaml文件中只有数组
如下,此时解析出yaml文件为数组类型
- id: 24
name: yaml
age: 18
此时输出:
<class 'list'> [{'id': 24, 'name': 'yaml', 'age': 18}]
yaml文件中只有字典
如下,此时解析出字典类型
users:
- id: 24
name: yaml
age: 18
此时结果为:
<class 'dict'> {'users': [{'id': 24, 'name': 'yaml', 'age': 18}]}
yaml同时存在字典和数组且不嵌套
这个时候会报错,解析不出来的
- id: 24
name: yaml
age: 18
users:
- id: 24
name: yaml
age: 18
XML,JSON,YAML对同一内容的不同表达
注意YAML中“-”表示是一个数组,且数组中包含4个元素。