Ruby yaml ypath как xpath?

Привет, у меня есть файл yaml, подобный этому

---
data:
  - date: "2004-06-11"
    description: First description

  - date: "2008-01-12"
    description: Another descripion

Как я могу выполнить запрос "ypath", похожий на xpath для xml? Что-то вроде "получить описание, где дата 2004-06-11"

YAML.parse_file('myfile.yml').select('/data/*/date == 2004-06-11')

Как вы это делаете, и если это возможно, как можно аналогично редактировать описание с помощью "ypath"?

Спасибо

Ответ 1

Файл yaml описывает хеш-отображение из строк в массивы хэшей, которые отображаются из строк в строки. Не существует такой вещи, как xpath для вложенных хэшей (по крайней мере, не в стандартной библиотеке), но достаточно просто со стандартными методами Hash и Enumerable:

hash = YAML.load_file('myfile.yml')
item = hash["data"].find {|inner_hash| inner_hash["date"] == "2004-06-11"}
#=> {"date"=>"2004-06-11", "description"=>"First description"}

Чтобы изменить описание, вы можете просто сделать item["description"] = "new description", а затем сериализовать хэш обратно в YAML с помощью hash.to_yaml.

Ответ 2

Там есть действительно такая вещь, как YPath: github.com/peterkmurphy/YPath-Specification

И это реализовано в Ruby YAML lib; см. документ для поиска BaseNode #.

Ответ 3

Если Ruby не является жестким ограничением, вы можете взглянуть на инструмент dpath. Он предоставляет xpath-подобный язык запросов для YAML (и других) файлов. Возможно, позвоните он внешне фильтрует ваши данные.