yaml

author author     2022-08-13     607

关键词:

YAML YAML Aint Markup Language。

YAML是一个类似GNU的递归式定义。GNU对Unix说“No”,YMAL则是对XML说“No”。而在Ruby的世界里,YAML可以说是Ruby流动的血液。YAML 之于Ruby,犹如XML之于Java。
为什么要向XML说“No”呢?因为:

YAML的可读性好。
YAML和脚本语言的交互性好。
YAML使用宿主语言的数据类型。
YAML有一个一致的信息模型。
YAML易于实现。

上面5条也就是XML不足的地方。同时,YAML也有XML的下列优点:
YAML可以基于流来处理;
YAML表达能力强,扩展性好。
总之,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。
YAML示例

首先用一个在Rails开发中一定会遇到的YAML文件——database.yml——作为示例。在你创建一个Rails工程后,Rails会自动给你创建一个这样的文件,它的路径是config/database.yml:
# MySQL (default setup).  Versions 4.1 and 5.0 are recommended.
# 此处省略一些注释。
development:
  adapter: mysql
  database: demo_development
  username: root
  password:
  host: localhost

# Warning: The database defined as ‘test‘ will be erased and
# re-generated from your development database when you run ‘rake‘.
# Do not set this db to the same as development or production.
test:
  adapter: mysql
  database: demo_test
  username: root
  password:
  host: localhost

production:
  adapter: mysql
  database: demo_production
  username: root
  password: 
  host: localhost
似乎很直观,对么?除去注释,会发现有三个组,分别用development、test和production标识。这三个组每个又有adapter、database、username、password和host这些属性。作为一个聪明的程序员,你一定已经意识到空格在这里发挥了作用!
完全正确!空格(注意:Tab不是)在YAML中用来表示代码的结构。上面的YAML文件可以被解析为一个哈希对象,它有三个元素,当然,每个元素又是一个哈希对象,下面是使用YAML::load(File.read(“database.yml”)) 方法获得的对象描述(为了保护视力和大脑,我进行了一些排版):
{
      development=> {adapter => mysql, database => demo_development,
                   ‘username’ => root, ‘password’ => nil, ‘host’ => localhost},
      ‘test’=> {‘adapter’ => mysql, ‘database’ => demo_test,
                   ‘username’ => root, ‘password’ => nil, ‘host’ => localhost},
      ‘production’=> {‘adapter’ => mysql, ‘database’ => demo_production,
                   ‘username’ => root, ‘password’ => nil, ‘host’ => localhost}
}
有了这个,你几乎就已经明白了所有在Rails中能遇到的YAML文件了,Rails中用到的YAML文件几乎永远是这种格式。例如,Rails为每个模型都会生成一个供单元测试使用的夹具(Fixture)文件,也是使用这种格式。
不过,Rails还加入了另外的灵活性。在这些属性中还可以使用Ruby代码!当然,对于数据库配置来说,这似乎用处不大,但是对于单元测试,有时你可能希望某个日期属性是当前测试的日期,那么这个功能就特别有用了。
Rails是怎样做到这个的,其实很简单。它在调用YAML::load方法之前先进行了ERB的解析,把Ruby代码执行后的结果再交给YAML进行加载,就可以得到这个小魔术了。下面是Rails加载数据库配置文件的代码:
YAML::load(ERB.new(IO.read(database_configuration_file)).result)
尽管Rails一般总是这样使用YAML,YAML实际上还有其他的一些用法,我们将在下面进行一些介绍。
YAML语言元素

下面对YAML的语言元素做一个简要介绍:
列表(List)
表示一个列表很简单,在每个条目前加入一个短横线。比如
- Item1
- Item2
- Item3
在Ruby中会被解释为数组对象(Array),上例为:
[“Item1”, “Item2”, “Item3”]
哈希表(Hash)
我们在前面的例子中已经大量使用了哈希表对象。哈希表的键/值之间用冒号(:)进行分隔。
key1 : value1
key2 : value2
key3 : value3
在Ruby中会被解释为如下的哈希对象:
{"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"}
字符串和其它基本类型
YAML会自动判断类型,一般性的文字都会被解释为字符串。在有可能发生歧义的情况下,可以为字符串加上单引号或者双引号(在双引号下转义字符会被转义,转义方式与C语言类似)来避免歧义。
下面是一个例子,包含了字符串、整数、浮点数和日期类型:
1 : 1.0
1.0 : "1.0"
"1.0" : 2006-01-01
它会被解释为:
{1=>1.0, "1.0"=>#<Date: 4907473/2,0,2299161>, 1.0=>"1.0"}
可以看出它的类型被很好的识别出来。
字符串块
字符串可能会占据多行,可以用两种方式来处理这种情况,一种是保留换行符,另外一种则去除换行符。
用| 表示保留换行符:
|
  This is line1.
  This is line2.
  This is line3.
它会被解释为:
"This is line1./nThis is line2./nThis is line3.">表示删除换行符:
>
  Hello, 
  world.
会被解释为:
"Hello,  world."
以上是一些常用的基本类型,当然它们还可以组合为更复杂的结构,比如列表的内容可以是列表本身,也可以是哈希表;哈希表的内容也可以是列表或哈希表,它们可以嵌套使用,来获得非常复杂的结构。
对于重复出现的项目,可以用&进行定义,然后用*进行引用。下面用一个比较完整的例子来说明这些内容(该例子取自http://en.wikipedia.org/wiki/YAML#Sample_Document)。
logEvent:    Purchase Invoice
date:        2007-08-06
customer:
    given:   Dorothy
    family:  Gale

bill-to:  &id001
    street: | 
            123 Tornado Alley
            Suite 16
    city:   East Westville
    state:  KA

ship-to:  *id001   

items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled "Ruby" Slippers 
      price:     100.27
      quantity:  1

specialDelivery:  >
    Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the 
    man behind the curtain.
它表示Ruby对象如下:
{
  "items"=>[
    {"price"=>1.47, "quantity"=>4, "part_no"=>"A4786", "descrip"=>"Water Bucket (Filled)"}, 
    {"price"=>100.27, "quantity"=>1, "part_no"=>"E1628", "descrip"=>"High Heeled /"Ruby/" Slippers"}
  ], 
  "bill-to"=>{"city"=>"East Westville", "street"=>"123 Tornado Alley/nSuite 16/n", "state"=>"KA"}, 
  "specialDelivery"=>"Follow the Yellow Brick Road to the Emerald City. Pay no attention to the  man behind the curtain.", 
  "date"=>#<Date: 4908637/2,0,2299161>, 
  "ship-to"=>{"city"=>"East Westville", "street"=>"123 Tornado Alley/nSuite 16/n", "state"=>"KA"}, 
  "customer"=>{"given"=>"Dorothy", "family"=>"Gale"}, 
  "logEvent"=>"Purchase Invoice"
}
YAML和JSON
近来火热的JSON可以看作是(几乎是)YAML的一个子集,一般说来,YAML的解析器都可以解析JSON文档。关于JSON的说明可以参见JSON的主页(http://json.org/),这里甚至还提供了一个中文版本的文档(http://json.org/json-zh.html)。
YAML相关资源:
· YAML主页:http://www.yaml.org/
· YAML维基百科:http://en.wikipedia.org/wiki/YAML
· Developerworks上的YAML简介:http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/index.html







require yaml

hash = {1 => sqlite3, 2 => postgresql, 3 => mssql, 4 => mysql, 5 => oracle}

# write yaml file
File.open("/home/user002/data.yaml", "wb") {|f| YAML.dump(hash, f) }

# read yaml file
data = YAML.load_file("/home/user002/data.yaml", "rb")

yml = YAML.load(File.open(unjs.txt))

 

YAML 未解析的外部符号 (yaml-cpp)

】YAML未解析的外部符号(yaml-cpp)【英文标题】:YAMLunresolvedexternalsymbol(yaml-cpp)【发布时间】:2016-05-1515:30:54【问题描述】:我有一个YAML文件,其中包含:abc:123我正在使用以下代码来加载它:YAML::Nodebase=YAML::Load("test.yaml");std::cout<... 查看详情

yaml

YAMLYAMLAin‘tMarkupLanguage。YAML是一个类似GNU的递归式定义。GNU对Unix说“No”,YMAL则是对XML说“No”。而在Ruby的世界里,YAML可以说是Ruby流动的血液。YAML之于Ruby,犹如XML之于Java。为什么要向XML说“No”呢?因为:YAML的可读性好。YAM... 查看详情

yaml文件解析(代码片段)

文章目录yaml文件解析YAML语法格式查看api资源版本标签写一个nignx.yaml文件demo编写service服务的资源清单用--dry-run命令生成yaml资源清单将现有的资源生成模板导出生成yaml文件yaml文件解析Kubernetes支持YAML和JSON格式管理资源对象JSON格... 查看详情

yaml文件解析(代码片段)

文章目录yaml文件解析YAML语法格式查看api资源版本标签写一个nignx.yaml文件demo编写service服务的资源清单用--dry-run命令生成yaml资源清单将现有的资源生成模板导出生成yaml文件yaml文件解析Kubernetes支持YAML和JSON格式管理资源对象JSON格... 查看详情

yaml文件解析(代码片段)

文章目录yaml文件解析YAML语法格式查看api资源版本标签写一个nignx.yaml文件demo编写service服务的资源清单用--dry-run命令生成yaml资源清单将现有的资源生成模板导出生成yaml文件yaml文件解析Kubernetes支持YAML和JSON格式管理资源对象JSON格... 查看详情

如何将 yaml 字符串插入到 yaml 值中,就好像它是 yaml

】如何将yaml字符串插入到yaml值中,就好像它是yaml【英文标题】:Howtoinsertayamlstringintoayamlvalueasifitisyaml【发布时间】:2021-06-1504:57:41【问题描述】:我需要一些关于python的帮助。我有两个数组:param_keys和param_values。第一个包含... 查看详情

python——yaml

参考技术A1.安装2.yaml文件的格式a)键值对形式b)序列listc)纯量strd)强制转换,使用!!e)多个文件:一个yaml文件里存在多个文件,用---表示,只能一起读取,不能分开读取3.yaml文件的读取xx.yaml4.yaml文件的写入5.yaml文件的持续... 查看详情

yaml.load与yaml.dump的用法(代码片段)

yaml文件的读取与保存 #读取yaml文件withopen(‘C:\Users\51102\Desktop\123\info.yaml‘)asf:temp=yaml.load(f.read(),Loader=yaml.FullLoader)labels=temp[‘label_names‘]dellabels[0]#删除列表第一个元素print(labels)#建立一个yaml文件withopen(‘C:\Users\51102\Desktop\123\i... 查看详情

解析 YAML 文件?

】解析YAML文件?【英文标题】:ParsingaYAMLfile?【发布时间】:2020-08-1321:08:58【问题描述】:如何使用yaml-cpp解析以下YAML文件?scene:-camera:film:width:800height:600filename:"out.svg"-shape:name:"muh"我试过了:#include<yaml-cpp/yaml.h>intmain()YAML::N... 查看详情

python之ruamel.yaml模块详解(代码片段)

Python之ruamel.yaml模块详解(一)1ruamel.yaml简介2ruamel.yaml安装2.1setuptools安装2.2pip安装ruamel.yaml2.3处理jinja2/YAML模板2.4yaml命令行实用程序3yaml.load()和yaml.dump()解析3.1yaml.load()读ymal文件3.2yaml.dump()写ymal文件3.3基于C的SafeLoader3.4基... 查看详情

如果有“!”,如何使用 PyYAML 解析 YAML在 YAML 中

】如果有“!”,如何使用PyYAML解析YAML在YAML中【英文标题】:HowtoParseYAMLUsingPyYAMLifthereare\'!\'withintheYAML【发布时间】:2019-02-1320:53:53【问题描述】:我有一个YAML文件,我只想解析description变量;但是,我知道我的CloudFormation模板... 查看详情

使用 YAML::Emitter 将嵌套映射和序列写入 yaml 文件

】使用YAML::Emitter将嵌套映射和序列写入yaml文件【英文标题】:WritingnestedmapsandsequencestoayamlfileusingYAML::Emitter【发布时间】:2018-02-0709:58:25【问题描述】:我一直在尝试使用YAML::Emitter输出yaml文件。例如,我需要这样的东西作为我... 查看详情

yaml概述(代码片段)

目录一.YAML概述二.YAML文件示例详解1.deployment.yaml文件详解2.Podyaml文件详解3.Serviceyaml文件详解三.YAML文件相关操作一.YAML概述Kubernetes支持YAML和JSON格式管理资源对象JSON格式:主要用于api接口之间消息的传递。YAML格式:用于配置和管理... 查看详情

如何在 Ruby 中的 YAML 文件中包含 YAML 文件

】如何在Ruby中的YAML文件中包含YAML文件【英文标题】:HowtoincludeaYAMLfileinsideaYAMLfileinRuby【发布时间】:2011-01-1716:57:17【问题描述】:在YAML中是否有自定义标签,让ruby​​可以在YAML文件中包含YAML文件?#E.g.:---!includefilename:another.y... 查看详情

YAML 异常:无效的 Yaml

】YAML异常:无效的Yaml【英文标题】:YAMLexception:InvalidYaml【发布时间】:2017-11-2516:50:30【问题描述】:我正在尝试在AWSElasticBeanstalk上对Tomcat服务器实施加密。我刚刚关注了this,并创建了一个.ebextensions/https-instance.config文件。但... 查看详情

yaml简要入门(代码片段)

这是一篇简单的YAML入门教程,目的是让你知晓什么YAML,以及YAML的基础语法。方便接下来学习如何使用Golang解析YAML。如果想获得更多YAML的知识,请查看http://yaml.orgYAML是层级结构的,如果你没有接触过xml、json这类文件话,你可... 查看详情

使用 ruamel.yaml 修改 YAML 会添加额外的新行

】使用ruamel.yaml修改YAML会添加额外的新行【英文标题】:ModifyingYAMLusingruamel.yamladdsextranewlines【发布时间】:2017-06-2913:40:43【问题描述】:我需要为YAML文件中的现有键添加一个额外的值。以下是我正在使用的代码。withopen(yaml_in_pa... 查看详情

yaml解析的方式? (yaml-cpp)

】yaml解析的方式?(yaml-cpp)【英文标题】:Thewayofyamlparsing?(yaml-cpp)【发布时间】:2011-02-2311:17:09【问题描述】:我已经制作了一个如下所示的yaml文件。Define1:&Define10:zero1:oneDefine2:<<:*Define12:two并在OnlineYAMLparser中尝试过。结... 查看详情