Поиск/проверка значений в документе YAML с помощью Ruby

моя цель:

  • проверьте, включает ли документ yaml значение для определенного ключа, используя ypath/xpath
  • выберите значение для указанного ключа, используя ypath/xpath
  • документ yaml:

    app:
        name: xxx
        version: xxx
    description:
        author:
            name: xxx
            surname: xxx
            email: [email protected]
    

    что было проверено:*

  • Google
  • переполнение стека
  • Ruby API (YAML::DBM, так как одним из предоставляемых методов является select)
  • пример:

    Module::Class.select('description/author/name')
    Module::Class.select('*/name')
    Module::Class.isset?('*/name')
    

    person xyz    schedule 12.02.2013    source источник


    Ответы (2)


    Поскольку актуальных реализаций YPath нет, я бы предложил дать шанс ActiveSupport и Nokogiri:

    yml = LOAD_YML_WITH_YOUR_PREFERRED_YAML_ENGINE
    
    # ActiveSupport adds a to_xml method to Hash
    xml = yml.to_xml(:root => 'yaml')
    
    doc = Nokogiri::XML(xml)
    doc.xpath("description/author/name").map do |name|
      puts [name['key'], name['value']]
    end
    
    person Aleksei Matiushkin    schedule 12.02.2013
    comment
    Да, мы не можем использовать YPath. Я безуспешно пытался использовать YAML/Psych::DBM. Я перестал использовать XML вместо YAML с помощью драгоценного камня Nokogiri. Спасибо. - person xyz; 13.02.2013

    Используйте ямл:

    require 'yaml'
    yml = YAML.load_file('your_file.yml')
    

    Теперь yml — это хэш. Вы можете использовать его как один. Вот простое и уродливое решение для того, что вы пытаетесь:

    if !yml["description"].nil? && !yml["description"]["author"].nil? && !yml["description"]["author"]["name"].nil? && !yml["description"]["author"]["name"].empty?
      puts "An author is set!"
    end
    
    person Ivaylo Strandjev    schedule 12.02.2013
    comment
    Здравствуйте, спасибо за ответ, но это не то, что я имел в виду, я обновил соответствующий раздел «Моя цель». БР. - person xyz; 12.02.2013
    comment
    Извините, ссылка на неправильный ответ. Взгляните сюда: stackoverflow.com/a/9977987/812912 - person Ivaylo Strandjev; 12.02.2013
    comment
    Да, я тоже это видел, но проблема в том, что в этом pdf нет примера. - person xyz; 12.02.2013
    comment
    Вы видели rdoc, на который ссылается пользователь? - person Ivaylo Strandjev; 12.02.2013
    comment
    Конечно, но, к сожалению, это не очень хорошо задокументировано в виде примера (работающая вещь). Если кто-то еще не работал с ypath в Ruby YAML, мне придется копать больше и пытаться найти правильный путь... но я бы не стал изобретать колесо с самого начала :) - person xyz; 12.02.2013