2010-03-20 8 views
11

Hallo ich habe eine YAML-Datei wie soruby ​​yaml ypath wie xpath?

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

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

Wie kann ich für xml ähnlich wie XPath eine „ypath“ Abfrage zu tun? So etwas wie „die Beschreibung, wo das Datum 2004-06-11 ist“

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

Wie Sie es tun, und wenn das möglich ist, wie kann ich in ähnlicher Weise die Beschreibung von ‚ypath‘ bearbeiten?

Dank

Antwort

3

Die YAML-Datei beschreibt ein Hash-Mapping von Strings in Arrays von Hashes, die von Strings Strings zuordnen. Es gibt nicht so etwas wie XPath für verschachtelten Hashes (zumindest nicht in der Standard-Bibliothek), aber es ist einfach genug, um mit Standard-Hash und Enumerable Methoden:

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

Um die Beschreibung zu ändern, können Sie dann einfach tun item["description"] = "new description" und Dann serialisieren Sie den Hash-Code mit hash.to_yaml wieder in YAML.

3

Wenn Ruby keine harte Einschränkung ist, können Sie sich das Tool dpath ansehen. Es bietet eine Xpath-ähnliche Abfragesprache für YAML (und andere) Dateien. Vielleicht rufen Sie extern an, um Ihre Daten zu filtern.

+0

neuer Link: http://search.cpan.org/dist/App-DPath/bin/dpath –

12

Es ist in der Tat so etwas wie YPath: github.com/peterkmurphy/YPath-Specification

Und es in Ruby YAML lib implementiert ist; Siehe das Dokument für BaseNode # Suche.

+0

Auf Ruby 1.9 müssen Sie möglicherweise 'syck' anfordern und' Syck :: BaseNode' verwenden. Auf Ruby 1.8 war es 'YAML :: BaseNode'. – Kelvin

+1

Die neue URL für die YPath-Spezifikation lautet: https://github.com/peterkmurphy/YPath-Specification –