一. YAML简介
估计大多数人都听说过XML,但YAML却很少听说,甚至都没有听说过,我也是其中之一,因为实习的公司需要用到这个相关的技术,也就特地了解了一下。为什么说起了YAML,却非要再提起XML呢?看这名字就知道,有故事呀。
首先,简要介绍一下YAML。YAML: YAML Ain't Markup Language,这是官方给的定义,什么意思呢?就是“YAML不是一种置标语言”。(在这里解释下置标语言:置标语言也称为标记语言,是一种将文本和与文本有关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码)。而XML,它是一种可扩展标记语言。
YAML相对于XML有哪些好处呢?
1. 可读性好
2. 与脚本语言的交互性好
3. 。。。。。。
总之,YAML就是致力于使用户以更简洁,更敏捷的方式去实现XML所能完成的任务。换句话说,是来砸XML饭碗的~~
还有一点,无关乎与XML的比较,是我从百度百科上查阅来的
1. “由于YAML使用空白字符和分行来分隔资料,使的他特别适合用grep、Python、Perl、Ruby操作。”
2. “其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构中会变得复杂而难以辨认。”
可能现在,你对这两点还无法理解,等看完下面内容,再回过头来看这个,便会豁然开朗~
好了,说完了好处,就开始具体说说YAML到底怎么表示以及怎么使用了。
二. YAML语法
在讲语法之前,首先在这里声明一下YAML的一些语法约束:
a. 在yaml里使用缩进表示层级关系,虽然很多人表示不喜欢这种方式,但是没办法,这样看着就是会更简洁一些。慢慢适应~
b. 在缩进时不允许使用tab(据了解好像是一些情况下tab表示的空格宽度不一)
c. 注意:同层元素,左侧对齐。很重要!
1、注释:
在yaml中,注释是以#开头的。从“#”字符开始一直到行尾都会被解析器给忽略
例:
# 看到没有,我就是注释内容~
2、文档(document)
在yaml中,一个yaml文件可以包含多个文档。且每个文档都以 --- 开始(即三个连字号),并且以三个点(...)结束。也就是说,可以用---来区分多个文档。其中有一点作为了解,可选择性的将...作为文档的结尾,使用...结尾时对于流式传输十分有用,可不需关闭流即知道到达结尾处。
3、 基础数据结构
yaml的设计者认为,配置文件中所要表达的数据结构有三种类型:
Scalar(标量,纯量):单个的,不可再分割的值
Mapping(映射,字典,对象):键值对的集合
Sequence(序列,数组,列表):一组按次序排列的值
这就是三种数据结构类型,下面对相关用法进行详细解释:
a. 首先是Sequence【用[...]】,一组连词线的行,构成了一个数组,如下:
- Cat
- Dog
- Pig
将上述转为JavaScript就是:
['Cat','Dog','Pig']
也可以直接使用 [...] 来表示:
[Cat,Dog,Pig]
此外,数组也可以采用行内表示法:
animal: [Cat,Dog]
转为相应的JavaScript如下:
{animal: ['Cat','Dog']}
b. 再就是Mapping【用{...}】,键值对之间要用冒号结构来表示,例如:
#要注意在冒号后面一定要有一个空格!
family: father
不过,yaml也允许另一种写法:
hash: { name: Steve, foo: bar}
Mapping中,对于单一的key/value 对:直接表示为: name: DTree
复杂key的key/value对:
#注意:当key为Sequence时要记得在key前面加上?
?[China,Japan,Malay]: AsianCountries
复杂value的key/value对:
AsianCountries: [China,Japan,Malay]
********************************************************************************************
在了解了Sequence和Mapping后我们就能更容易地理解一些复合结构:
family:
- father
- mather
- me
China:
Anhui: Hefei
Jiangsu: Nanjing
Henan: Zhengzhou
转为JavaScript如下:
{
family: ['father', 'mather', 'me'],
China: {
Anhui: 'Hefei',
Jiangsu: 'Nanjing',
Henan: 'Zhengzhou'
}
}
********************************************************************************
c. 下面开始详细介绍Scalar(标量,纯量)
以下数据类型都属于JavaScript的纯量:
*布尔值(true,false)
*字符串
*整数
*浮点数
*Null
*时间
*日期
其中有几点重点提下:
**在yaml中,null用~来表示
YAML中:parent: ~
JavaScript中:{parent: null}
**yaml中允许使用两个感叹号,强制转换数据类型:
YAML中:e: !!str 123
f: str true
JavaScript中:
{e: '123',f: 'true'}
4.YAML中的字符串:
在YAML中,字符串默认不用引号表示,但是如果字符串之中包含空格或者特殊字符,则需要放在引号之中:
#不含特殊符号
str: 这是一行字符串
#含特殊符号
str: '内容: 字符串'
#单引号和双引号的区别,其中双引号不会对特殊字符转义
s1: '内容\n字符串'
s2: "内容\n字符串"
#转为JavaScript后:
#{s1: '内容\\n字符串',s2: '内容\n字符串'}
#单引号之中如果还有单引号,则必须使用两个单引号进行转义:
str: 'labor''s day'
#转为 JavaScript
#{ str: 'labor\'s day' }
#字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
str: 这是一段
多行
字符串
#转为 JavaScript
#{ str: '这是一段 多行 字符串' }
#多行字符串可以使用|保留换行符,也可以使用>折叠换行
this: |
Foo
Bar
that: >
Foo
Bar
#转为 JavaScript:
#{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
#+表示保留文字块末尾的换行,-表示删除字符串末尾的换行。
s1: |
Foo
s2: |+
Foo
s3: |-
Foo
#转为 JavaScript
#{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }
5. YAML中的引用
锚点& 和 别名*,可以用来引用-------看了下面的语法就会感觉有点像C语言哈~
#&代表此模块可以被引用,建立锚点(defaults)
#<<表示合并到当前数据,*用来引用锚点
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
等同于下面的代码:
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost