2010-03-20 7 views
11

Salut j'ai un fichier YAML comme siruby ​​yaml ypath comme xpath?

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

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

Comment puis-je faire un « ypath » requête similaire à XPATH pour xml? Quelque chose comme « obtenir la description où la date est 2004-06-11 »

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

Comment faites-vous, et si cela est possible comment puis-je modifier de façon similaire la description par « ypath »?

Merci

Répondre

3

Le fichier YAML décrit un mappage de hachage à partir de chaînes à des tableaux de hash qui tracent des cordes à cordes. Il n'y a pas une telle chose comme XPath pour hash imbriqués (au moins pas dans la bibliothèque standard), mais il est assez simple avec Hash et méthodes Enumerable standard:

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

Pour modifier la description, vous pouvez le faire simplement item["description"] = "new description" et puis sérialiser le hachage à YAML en utilisant hash.to_yaml.

3

Si Ruby n'est pas une contrainte stricte, vous pouvez jeter un oeil à l'outil . Il fournit un langage de requête de type xpath aux fichiers YAML (et autres). Peut-être appelez en externe pour filtrer vos données.

+0

nouveau lien: http://search.cpan.org/dist/App-DPath/bin/dpath –

12

Il est en effet une telle chose comme YPath: github.com/peterkmurphy/YPath-Specification

Et il est mis en œuvre dans YAML lib de Ruby; voir le document pour la recherche BaseNode #.

+0

Sur Ruby 1.9, vous devrez peut-être utiliser 'syck' et utiliser' Syck :: BaseNode'. Sur Ruby 1.8 c'était 'YAML :: BaseNode'. – Kelvin

+1

La nouvelle URL pour la spécification YPath est: https://github.com/peterkmurphy/YPath-Specification –