代码之家  ›  专栏  ›  技术社区  ›  Summit Guy

在Ruby中,如何遍历yaml树中的所有节点?

  •  3
  • Summit Guy  · 技术社区  · 16 年前

    我正在加载一个任意的yaml文档,并希望遍历树中的每个节点。我不知道树是如何预先嵌套的,所以我不能只使用简单的每条语句来遍历所有节点。

    以下是我加载文档的方式:

    tree = File.open( "#{RAILS_ROOT}/config/locales/es.yml" ){ |yf| YAML::load (yf)}
    
    2 回复  |  直到 13 年前
        1
  •  12
  •   sepp2k    16 年前
    def traverse(obj, &blk)
      case obj
      when Hash
        # Forget keys because I don't know what to do with them
        obj.each {|k,v| traverse(v, &blk) }
      when Array
        obj.each {|v| traverse(v, &blk) }
      else
        blk.call(obj)
      end
    end
    
    traverse( YAML.load_file(filename) ) do |node|
      puts node
    end
    

    编辑:

    注意,这只会生成叶节点。问题不太清楚到底想要什么。

        2
  •  4
  •   1gor    13 年前

    下面是如何解析yaml树结构并执行 每个 节、枝和叶。它还为您提供了所需的每个节点的父节点,例如,在从您的yaml文件填充数据库树结构时。这是对@sepp2k的一个小补充,非常好的答案:

    require 'yaml'
    
    def traverse(obj,parent, &blk)
     case obj
     when Hash
       obj.each do |k,v| 
         blk.call(k,parent)
         # Pass hash key as parent
         traverse(v,k, &blk) 
       end
     when Array
       obj.each {|v| traverse(v, parent, &blk) }
     else
       blk.call(obj,parent)
     end
    end
    
    
    # Example, creating a database tree structure, from your YAML file.
    # Passing nil to root node(s) as parent
    
    tree_str =<<EOF
      Regions:
        - Asia
        - Europe
        - Americas
      Other:
        - Foo:
          - bar
          - buz
    EOF
    
    traverse( YAML.load(tree_str), nil ) do |node,parent|
      puts "Creating node '#{node}' with parent '#{ parent || 'nil' }'"
    end
    
    推荐文章