YAML总结

     一. 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

          







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值