标记语言一文速通

摘要

本文主要一并介绍一些标记类语法,具体而言是 JSON,yaml,xml 三种语言的语法介绍。

JSON

本质:数据格式

json 不是一种编程语言或者技术,而是一种传递数据的格式,这从他的命名之间就能看出来:JavaScript Object Notation。以面向复杂结构为主,相对于直接使用字符串的简单类型,JSON 以对象-成员的基本编写逻辑组合数据,所以 JSON 导入之后就是一个对象(结构体+语言提供的解析方法)。

类型

JSON 支持以下几种类型(作为值):

  1. 数字
  2. 字符串,使用双引号表示
  3. 布尔
  4. null
  5. 对象:使用一对大括号包裹
  6. 上述内容的数组:使用方括号包裹。内部是键值对(“键”: 值)

格式

键值对规定

  1. 键值一定是字符串,也就是以"键": 值 的格式进行
  2. 键值对之间使用逗号分割,最后一个不适用逗号
  3. JSON 不支持任何形式的注释

整体的格式要求

  1. 整体的 json 只有一个顶层对象,也就是所有的内容都在一个根元素以内,不能存在第二个顶层元素。

形式化的递归定义:

  1. json 支持四种基本的数据形式:数字,字符串,布尔
  2. json 的基本组成单位是对象,最简单的对象是{}
  3. 使用键值对"key":value 的形式置入 json 四种基本值,也是合法对象
  4. 对象也是合法键值
  5. 上述的五种类型构成的数组也是合法键值
  6. 整个 json 文件只有一个对象组成

语法

JSON 主要涉及两个函数:Stringfy 和 parse, 绝大多数现代语言都实现了这两个方法,来实现对象字符串的转换,此处以 js 为例。

const data={"name": "CH","gender": "male","age":99};
const pa=JSON.stringfy(data);
const res= data.parser(pa);

值得说的是,上述的解析是直接创建一个新的副本的,程序里的 data 和 res 是两个内容相同的不同内存块,而不是指向同一块内存的两个引用。

yaml

yaml 是一种人类可读的数据序列化格式

类型

  1. 字符串(引号可选)
  2. 数字(整数,浮点)
  3. 布尔
  4. null
  5. 日期
  6. 数组:缩进一层使用-表示每一个成员
  7. 嵌套结构

格式与语言规范

  1. 不同于 json 这种基于传统的大括号逻辑,yaml 是缩进逻辑,元素间的层级关系是通过缩进表示的,也可以在行内使用 json 语法
  2. 同样适用键值对格式,但是键不强制使用引号,编写方便。
  3. 没有 json 那种一定要顶部元素的设定,默认有一个外部包装,内部可以有若干个顶层成员
  4. 缩进之间支持嵌套
  5. 有跨行语法
  6. 使用#做注释
student:
  - name : CH
    age : 19
    gender: man
  - name : JQ
    gender: woman
    location : New York
workers:
  - name : Alan Walker
    jop : DJ
    
# 嵌套语法展示

multline : | # 类似raw字符串,保留格式
multline : > # 只是一种比较方便看长字符的格式,最后会折叠成一行
multline : |2 # 保留换行与缩进
multline : |- # 去掉尾换行,+是强制使用换行

反斜杠换行:对于长串,也可以使用反斜杠来折回来,便于阅读。

特殊的变量语法

yaml 没有 json 那么老实的直接有对应关系,而是引入了一些变量系统。称为锚点和别名

  1. 使用 &修饰符,将一种变量格式设置为别名
  2. 使用 *name 的格式使用(完整的不可修改的内容)
  3. << * name 是继承语法,会沿用原本的元素,使用堆叠式的复制,也就是不会覆盖掉已经声明的同名成员(注意这个不是所有解析器都支持)
  4. 也可以将一些字面值设置别名并使用锚点匹配

复杂键:yaml 的键值不是单纯地字符串,也可以是正常的 yaml 直接值,对于复杂键,使用?做键标识。

语法

与 json 类似,yaml 的库函数大致有两类;load 和 dump,对应了 parse 和 stringfy。

XML

xml 是一种广泛使用的,类似于 HTML 的标记语言,比起前两个,可表达的信息更多,很多数据内部都是使用 xml +压缩包实现的。
xml 的设计更接近 html-like 的 json,他们都在传输内容中有较大作用,而 yaml 更加偏向于本地标记语言。

特点:

  1. xml 没有规定任何标签,大部分是约定俗成的
  2. xml 的元素名中间不能使用空格,也不能以 xml 三字母开头的非保留字
  3. 严格区分大小写(其实三者都一样)
  4. 标签是层级结构,不能互相嵌合。

语法

标签语法:与 HTML 高度一致
标签名 <name></name>
自闭合标签: <name/>
注释:<!-- info –>
属性: 与 HTML 保持一致:<name 属性=“值” 属性2=“值”>……
CDATA:转义符,处理一些被语法占用的符号

XML 约束

约束相当于一个编写文档,对 xml 的格式提出要求。

DTD 约束

一种类似关键字+正则的匹配规定策略。

Schema约束

DTD 的升级版本,语法更加贴近 xml 本身,但是语法规则复杂,这里不特意展开,还是给 AI 来写吧(

语法

xml 使用的函数也有 parse 和 stringfy 的类似方法,但是语言之间的实现差异较大,所以仅仅提及。

总结

这几种语言在学习时经常出现,也不断要写,但是每次都是有样学样,没有掌握的说法,所以这里专门整理出来,以供快速查验,也便于使用更多高级语法来简化工作。
三种数据结构各有异同,比如 json,yaml 比较轻量但是表达比较有限而且不好看,xml 虽然很重但是拓展功能很多,相对容易读。xml 和 yaml 都引入了解释器和动态语法,而 json 相对比较简单,只是一种数据表示格式,也表示传输性质好。实际使用的时候要根据需求灵活选择使用
三种语法都是进行对象储存的方式,还有诸如 csv 等结构化的储存方式。但是相对而言标准比较同意,格式比较明显,所以不多介绍。