2010-03-20 18 views
11

Hola tengo un archivo YAML como talruby ​​yaml ypath como xpath?

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

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

¿Cómo puedo hacer una consulta "ypath" similar a XPath para XML? Algo así como "obtener la descripción donde la fecha es 2004-06-11"

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

¿Cómo lo haces, y si eso es posible, de manera similar cómo puedo editar la descripción de 'ypath'?

Gracias

Respuesta

3

El archivo yaml describe un mapeo de hash a partir de cadenas de matrices de valores hash que se asignan a partir de cadenas de cadenas. No hay tal cosa como XPath para hashes anidados (al menos no en la biblioteca estándar), pero es bastante simple con Hash estándar y métodos enumerables:

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"} 

Para cambiar la descripción, a continuación, puede simplemente hacer item["description"] = "new description" y luego, serialice el hash nuevamente en YAML usando hash.to_yaml.

3

Si Ruby no es una restricción difícil, puede echar un vistazo a la herramienta dpath. Proporciona un lenguaje de consulta similar a xpath para archivos YAML (y otros). Tal vez llame al externamente para filtrar sus datos.

+0

nuevo enlace: http://search.cpan.org/dist/App-DPath/bin/dpath –

12

Hay es cosa de hecho como YPath: github.com/peterkmurphy/YPath-Specification

Y se implementa en lib YAML de Ruby; ver el documento para BaseNode # search.

+0

En Ruby 1.9, puede necesitar requerir 'syck' y usar' Syck :: BaseNode'. En Ruby 1.8 era 'YAML :: BaseNode'. – Kelvin

+1

La nueva URL para la especificación YPath es: https://github.com/peterkmurphy/YPath-Specification –