2013-05-01 15 views
7

Tôi có một file YAML với một vài mục mà trông như thế này:Làm cách nào để phân tích cú pháp YAML thành băm/đối tượng?

001: 
    :title: Some title 
    :description: Some body text maybe 
002: 
    :title: Some title 
    :description: Some body text maybe 

Tôi đang sử dụng phương pháp của Ruby sau đây để phân tích rằng file YAML thành một tập các đối tượng tôi có thể lặp qua:

def parse_yaml(file) 
    YAML::load(File.open(File.join(settings.yaml_folder, file))) 
end 

def use_yaml 
    @items = parse_yaml('items.yml') 
    @items.each do |item| 
    x = item[1][:title] 
    etc... 
    end 
end 

Bây giờ, phương thức đó hoạt động, nhưng tôi thấy nó có vẻ giống như vậy mà tôi cần sử dụng item[1][:title] để truy cập các thuộc tính của đối tượng mà tôi đang lặp lại. Làm cách nào để xây dựng tệp YAML hoặc mã phân tích cú pháp của tôi để cho phép tôi sử dụng tiêu chuẩn item[:title]?

Trả lời

8

Đó là một Hash. Các parse_yaml đầu ra là:

{ 1=> 
     { :title=>"Some title", 
     :description=>"Some body text maybe"}, 
    2=> { :title=>"Some title", 
     :description=>"Some body text maybe" } 
} 

Bạn có thể sử dụng phương pháp each_value như thế này:

#... 
@items = parse_yaml('items.yml') 
@items.each_value do |item| 
    x = item[:title] 
    # ... etc 
end 

khuyên: YAML for Ruby

1

YAML của bạn là serialization của một băm, do đó bạn có thể làm:

@items.each do |key, item| 
    #do something with item[:title] 
end 

Hoặc thay đổi YAML của bạn trông giống như:

- :title: blah 
    :description: description 
- :title: second title 
    :description: second description 

Mà sẽ dẫn đến YAML.load trả lại một mảng.

3

Vấn đề cơ bản là tệp YAML của bạn đang lưu trữ dữ liệu dưới dạng băm và cố gắng truy cập dữ liệu như một mảng.

Để chuyển đổi dữ liệu của bạn sang định dạng mảng:

--- 
- :title: Some title 
    :description: Some body text maybe 
- :title: Some title 
    :description: Some body text maybe 

Cũng thú vị cần lưu ý, lý do bạn phải sử dụng item[1][:title] để tham khảo các mặt hàng của bạn là chìa khóa 001002 được chuyển đổi thành số nguyên bởi YAML.load .

Bạn có thể xác nhận điều này trong IRB:

irb(main):015:0> YAML.load(File.open("./test.yml")) 
=> {1=>{:title=>"Some title", :description=>"Some body text maybe"}, 2=>{:title=>"Some title", :description=>"Some body text maybe"}}