0

我有一个包含许多表单条目的 yaml 文件

item1:
  name: item1
  stem: item1

items2:
  name: item2
  stem: item2

由于每条记录的信息都遵循相同的形式,因此有没有办法将其干燥?

我想以某种方式指定无论我如何命名条目,它也应该用于名称和词干。

我知道我可以标记条目&tag并在其他条目中引用它们,<<: *tag但这是针对实际内容而不是表单。

4

1 回答 1

1

据我所知,YAML 没有用于循环和生成 1.2 规范的动态内容的设施:http ://www.yaml.org/spec/1.2/spec.html 。它只是一个序列化数据的标准。但是,如果您的目标是在 YAML 文件中生成不重复的类似对象,则可以使用 YAML 的实现,并以编程语言(例如 Ruby)返回一个数组。

YAML 的 Ruby 实现提供“对来自 Ruby 中可用的任何类的序列化对象的通用支持。”:http ://www.yaml.org/YAML_for_ruby.html#objects这意味着您可以在 Ruby 中创建一个包含您的条目的 Array 对象通过创建自定义类在 YAML 文件中重复。

下面的示例类将生成x数组中的项目,如 YAML 键所定义items

像这样构造 YAML 文件:

--- !ruby/object:Foo
  items: 2

注意:要调用的类名在名字上指定,使用在以下位置定义的 Object 语法:http ://www.yaml.org/YAML_for_ruby.html#objects

在 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"}}]

YAML 文件是在定义我们的类之后加载的FooFoo在初始化时接受一个整数,这是我们将在generate调用时创建的项目数。generate然后循环多次,并将新对象推送到数组,然后返回。

在此示例中,您必须显式调用generate,因为您不能从initialize.

我不确定这是否是您正在寻找的答案,但通过外包自定义类中对象的循环和创建,这可能是保持 YAML 结构干燥的一种方法。

这种方法也可以用于其他语言,具体取决于它们的 YAML 实现是否支持自定义序列化类。有关其他语言实现库,请参见http://yaml.org/ 。

于 2012-08-28T18:42:02.347 回答