我有一个yaml文件,其中包含多个
形式的条目item1:
name: item1
stem: item1
items2:
name: item2
stem: item2
有没有办法干掉它,因为每条记录的信息都遵循相同的形式?
我想以某种方式指明无论我使用该条目的名称,它还应该用于名称和词干。
我知道我可以使用&tag
标记条目,并使用<<: *tag
在其他条目中引用它们,但这是针对实际内容而不是表单。
答案 0 :(得分:1)
YAML,据我所知,没有设置循环,并生成1.2规范的动态内容:http://www.yaml.org/spec/1.2/spec.html。它只是序列化数据的标准。但是,如果您的目标是在YAML文件中生成不重复的类似对象,则可以使用YAML的实现,并以编程语言(如Ruby)返回Array。
YAML的Ruby实现提供了“从Ruby中可用的任何类序列化对象的通用支持。”:http://www.yaml.org/YAML_for_ruby.html#objects这意味着您可以在Ruby中创建一个Array对象,其中包含您在YAML文件中重复的条目创建自定义类。
下面的示例类将在数组中生成x
项,由YAML键items
定义。
像这样构建YAML文件:
--- !ruby/object:Foo
items: 2
注意:使用在http://www.yaml.org/YAML_for_ruby.html#objects定义的Object语法在第一个名称上指定要调用的类名
在Ruby中,定义您的类,并加载您的YAML文件以进行解析:
class Foo
attr_accessor :items
def initialize(items)
@items = items
end
def generate
x = 1
result = []
while x < @items do
result.push({ "item#{x}" => {"name" => "item#{x}", "stem" => "item#{x}"} })
x+=1
end
result
end
end
foo = YAML.load_file('/path/to/yaml.yml') # => #<Foo:0xa1ff694 @items=2>
foo.generate # => [{"item1"=>{"name"=>"item1", "stem"=>"item1"}}, {"item2"=>{"name"=>"item2", "stem"=>"item2"}}]
在定义类Foo
后加载YAML文件。 Foo
在初始化时采用整数,这是我们在调用generate
时将创建的项目数。 generate
然后循环多次,并将一个新对象推送到一个数组,然后返回该数组。
在此示例中,您必须明确调用generate
,因为您无法从initialize
返回除self之外的任何内容。
我不确定这是否是您正在寻找的答案,但通过在自定义类中外包循环和创建对象,可能是保持YAML结构干燥的可能方法。
此方法也可以在其他语言中使用,具体取决于它们的YAML实现是否支持自定义序列化类。有关其他语言实现库,请参阅http://yaml.org/。