什么是YAML?

本文介绍了YAML这种数据序列化语言,它是一种可读的文本数据结构,设计目标是让人易读、程序易处理。它类似XML但更简单,主要关注动态编程语言中的数据结构和类型。文中还介绍了YAML的语法,以及Ruby对其的支持。

作者  liubin                http://www.ruby-cn.org/

本文地址  http://www.ruby-cn.org/articles/what_is_yaml.html

1.YAML ="YAML Ain't Markup Language"

    官方网站的解释是YAML ="YAML Ain't Markup Language"(缩写为YAML)。这是一种数据序列化(serialization )语言,是一种可读的文本的数据结构,它的设计目标是使人们容易读,程序容易处理。它类似XML,但是比XML简单。

 

2.设计目标:

     YAML的设计目标如下:

  1. YAML 文档很容易阅读。
  2. YAML 使用本地结构存储数据。
  3. YAML 数据在编程语言之间是可移植的。
  4. YAML 有一个固定的模型来支持一般的开发工具。
  5. YAML 支持基于流的处理。
  6. YAML 表现力强,而且容易扩充。
  7. YAML 容易实现和使用。

3.和XML的关系

    新手总是试图了解YAML和XML的关系,这两种语言在某些领域是处于竞争之中,除此没有什么直接关系。

    YAML 首先是一种数据序列化语言,而XML则是向后继承了SGML(Standard Generalized Markup Language)。XML试图做到面面俱到,它试图成为一种文档格式、数据格式、消息包格式、安全的 RPC 通道(SOAP)甚至XML数据库;而YAML只关注有限的领域,它只是清晰地表示在动态编程语言(如 Perl、Python、Ruby)中所遇到的数据结构以及数据类型。目前,对于这些语言,已经有了一些绑定/库。
需要指出,我们已经开始做XML/YAML MAPPING的工作了,更多的信息可以访问: http://yaml.org/xml/

4.YAML初步

    YAML中数据主要由序列(sequence),map(有的也叫做hash)和标量(scalar )来表示。语法比较简单,易于人们阅读。

  • 注释由#开头
  • 序列由"-"开头
  • map用key:value的格式
  • "---"表示一个yaml文档的开始
  • list和hash可以嵌套
  • block的概念:一个 block 是一段文本。
  • Inline Collections:数据都写在一行

例子:

1。序列
- apple 
- banana 
- carrot 
2。嵌套序列
- apple 
- 
 - foo 
 - bar 
 - x123 
- banana 
- carrot 
3。map
foo: whatever 
bar: stuff 
4。map和sequence嵌套
foo: whatever 
bar: 
 - uno 
 - dos 
5。map嵌套
foo: whatever 
bar: 
 fruit: apple 
 name: steve 
 sport: baseball 
6。inline hash
--- 
 hash: { name: Steve, foo: bar }

 

5.Ruby中的YAML支持

    Ruby1.8已经包含了YAML支持了。只需要require进来就行了。

一个例子:

# file name yaml.rb

require 'yaml'

class Person

  attr_accessor :name, :sex, :age, :email

  def initialize(n,s,a,e)
    @name=n
    @sex=s
    @age=a
    @email=e
  end

end

#创建一个对象
person=Person.new("liubin","male",25,"liubin@huangpuzhuang.com")
puts (person.to_yaml) # 打印序列化之后的结果

#从person.yml创建对象
person2 = YAML::load( File.open( 'person.yml' ) )
puts (person2.to_yaml)
puts person2.class # 结果是Person
puts person2.name

 person.yml文件:

--- !ruby/object:YAML::Person            
age: 18
email: xyz@huangpuzhuang.com
name: xyz
sex: female

 

   注意person.yml中第一行“--- !ruby/object:YAML::Person   ”是不可缺的,否则person2.class返回Hash,而person2.name也会出错

  

 

程序执行情况如下:
C:/>ruby yaml.rb
--- !ruby/object:Person
age: 25
email: liubin@huangpuzhuang.com
name: liubin
sex: male
--- !ruby/object:Person
age: 18
email: xyz@huangpuzhuang.com
name: xyz
sex: female
Person
xyz

 

总结:yaml东西很多,不是一时半会能学会和讲清楚的,希望我们一起学习。接下来请看我的另一篇文章:http://www.ruby-cn.org/articles/yaml_in_5_minutes.html,也许会更了解yaml。

参考资料:

1.ruby语言主页:http://www.ruby-lang.org/

2.yaml主页:http://yaml.org/

### YAML 文件是什么? YAML 是一种以数据为中心、高度可读的文本格式,旨在提供一种简洁且易于阅读的方式来表示数据结构。它广泛应用于配置文件、资源清单、数据交换以及自动化工具中。与其他常见的数据序列化格式(如 JSON 和 XML)相比,YAML 更注重可读性,因此在配置管理和声明式部署中特别受欢迎[^2]。 #### 基本语法与格式 YAML 文件通过缩进表示层级关系,且只能使用空格缩进,不能使用 Tab。通常,每个层级缩进两个空格。冒号、逗号等符号后需要有一个空格。此外,使用 `---` 表示一个新的 YAML 文件的开始,使用 `#` 表示注释。这种格式非常适合用于描述嵌套结构,例如键值对、列表和嵌套对象[^3]。 ```yaml # 示例 YAML 文件 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 8080 ``` #### 数据类型与类型转换 YAML 支持多种内置数据类型,包括整数(`!!int`)、浮点数(`!!float`)、布尔值(`!!bool`)、字符串(`!!str`)、日期时间(`!!timestamp`)、空值(`!!null`)、集合(`!!set`)、键值列表(`!!omap` 或 `!!pairs`)、序列(`!!seq`)和键值表(`!!map`)。可以通过双感叹号加类型名的方式进行显式类型转换[^4]。 ```yaml a: !!float '666' # 强制转换为浮点数 b: '666' # 字符串 c: !!str 666 # 整数转字符串 d: !!str 666.66 # 浮点数转字符串 e: !!str true # 布尔值转字符串 f: !!str yes # 布尔值转字符串 ``` #### 应用场景 YAML 被广泛用于 Kubernetes(k8s)中进行资源管理和对象编排。通过 YAML 文件,可以声明式地定义资源对象的期望状态,并使用 `kubectl` 命令进行部署和管理。例如,Kubernetes 中的 Deployment、Service、Pod 等资源都可以通过 YAML 文件来配置和部署[^3]。 此外,YAML 也常用于机器人操作系统(ROS)中的参数配置,如 SLAM Toolbox 的参数文件。通过 YAML 文件,用户可以灵活地配置 SLAM 算法的行为,以适应不同的机器人平台和传感器输入[^1]。 #### 数据重用与合并 YAML 支持锚点(`&`)和引用(`*`)机制,允许在文件中定义可重用的数据块,并在其他位置引用它们。这种方式可以减少重复配置,提高配置文件的可维护性。此外,还可以使用 `<<` 操作符实现合并功能,将多个锚点的内容合并到一个对象中。 ```yaml base_config: &base port: 8080 timeout: 30s server1: <<: *base name: "Server 1" server2: <<: *base name: "Server 2" port: 9090 ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值