Разбор YAML в Ruby: Как получить элементы только определенного типа? - PullRequest
0 голосов
/ 05 июля 2011

У меня есть следующий YAML:

- name: List of monkeys
- author: Nicolas Raoul
- version: 2
- monkey: 
   - name: Chee-Chee
   - age: 2
- monkey:
   - name: Curious George
   - age: 6
   - food: bananas
- monkey:
   - name: Mojo
   - food: peanuts

В Ruby, как получить обезьян?
Количество параметров метаданных в преамбуле (имя, автор, ...) является переменным.

Было бы возвращено что-то вроде:

[{"monkey"=>[{"name"=>"Chee-Chee"}, {"age"=>2}]}, {"monkey"=>[{"name"=>"Curious George"}, {"age"=>6}, {"food"=>"bananas"}]}, {"monkey"=>[{"name"=>"Mojo"}, {"food"=>"peanuts"}]}]

В XML / XPath я просто написал бы /monkey, но каков синтаксис с YAML / Ruby?

Примечание: я не хочу создавать узел monkeys, содержащий все обезьяны как подэлементы, потому что есть много обезьян, и клиенты будут редактировать файл, чтобы добавить больше, поэтому я хочу, чтобы файл был действительно простым.Я новичок в YAML, поэтому может потребоваться лучшая организация, но краткость имеет первостепенное значение, в частности, я не хочу увеличивать количество подуровней.

1 Ответ

3 голосов
/ 05 июля 2011

Вы можете использовать метод Enumerator #select, чтобы вернуть только обезьян из вашей коллекции.Если ваш проанализированный объект YAML находится в переменной с именем your_yaml, этот код вернет то, что вы просите:

your_yaml.select { |item| item['monkey'] }

Возможно, вам не нужны дефисы ввторой уровень.Если вы измените это ...

- monkey: 
   - name: Chee-Chee
   - age: 2

На это:

- monkey: 
    name: Chee-Chee
    age: 2

Свойства обезьяны будут хешем, а не массивом хешей.Я полагаю, это более полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...