2

假设您有一个这样的 YML 文件:

en:
  thanksgiving:
    turkey: 'Turkey'
    stuffing: 'Stuffing'
  christmas:
    ham: 'Bring ham'
  thanksgiving:
    beer: 'lots of beer'

并且您想使用 ruby​​ 基本上像这样读取、合并和重写该 YML:

en:
  thanksgiving:
    turkey: 'Turkey'
    stuffing: 'Stuffing'
    beer: 'lots of beer'
  christmas:
    ham: 'Bring ham'

实现这一目标的最好/最有效的方法是什么?

4

1 回答 1

1

您需要解析文件以获取节点表示:

yml = YAML.parse( open('c:\temp\foo.yml'))

yml变量包含整个结构。示例:键入以下内容将打印实际的整个文件内容

pp yml 

检查结果后,我能够编写一个安全的序列化程序。添加一个名为config/initializers/yaml.rb

module YAML

  def YAML.safe_load(file_name)
    YAML::safe_load_node(YAML::parse(IO.read(file_name)))
  end

  def YAML.safe_load_node(input)
    case input.kind
    when :map
      {}.tap do |h|
        input.value.each do |key, node|
          k,v = key.value, YAML::safe_load_node(node)
          if (v.is_a?(Hash) and h[k].is_a?(Hash))
            h[k] = h[k].merge(v)
          elsif (v.is_a?(Array) and h[k].is_a?(Array))
            h[k] = h[k] + v
          else
            h[k] = v
          end
        end
      end
    when :seq
      input.value.map{|node| YAML::safe_load_node(node)}
    when :scalar
      input.value
    end
  end

end 

现在在 Rails 控制台中:

>> y YAML::safe_load('c:/temp/test.yml')
---
en:
  christmas:
    ham: Bring ham
  thanksgiving:
    turkey: Turkey
    stuffing: Stuffing
    beer: lots of beer
于 2012-06-08T02:26:56.833 回答