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个元素。

posted @ 2022-03-09 15:06  肖肖凯  阅读(209)  评论(0编辑  收藏  举报