Yaml

Ich habe ja bereits mehrmals auf das Yaml-Format hingewiesen (offizielle Homepage, Wikipedia-Artikel) und ich verwende es auch in diversen Projekten derzeit recht erfolgreich. In diesem Artikel möchte ich kurz erläutern was Yaml eigentlich ist und wie es verwendet wird.

Grundsätzliches


Bei Yaml handelt es sich um ein Format zur Darstellung von Datenstrukturen. Was Yaml nicht ist, ist ein Austauschformat wie XML bei dem so ziemlich jede Platform problemlos die kompliziertesten Systeme darstellen soll. Weiterhin sollte man niemals Tabs in Yaml-Dateien verwenden, schon garnicht mit Leerzeichen vermischt. Da der Parser dann natürlich nicht mehr genau wissen kann was wie lang ist, können die seltsamsten Effekte auftreten.
Eine Yaml-Datei enthällt keinerlei Definitionen in welchem Zeichencode sie geschrieben ist, man kann für yaml kaum eine Definition aufstellen welcher Datentyp wo erwartet ist und Yaml kann auch stellenweise schwer dazu gebracht werden ALLE Sonderzeichen gleichzeitig in einem String zu akzeptieren.

Das ist allerdings auch alles nicht nötig, denn Yaml dient einem völlig anderem Zweck und verfolgt daher auch andere Ziele.
Yaml versucht sich auf ein Mindestmaß an komplexität zu beschränken, ohne die darstellbaren Daten einzuschränken. Dafür bedient sich Yaml nur 3er Konzepte: assoziative Listen, Arrays und Einzelwerte.
Ein weiteres Kernkonzept ist diese Konzepte möglichst gut lesbar darzustellen.

Array:
    - eintrag1
    - eintrag2
    - eintrag3


assoziative Liste:
    blah: Eintragstext 1
    blubb: 'Eintragstext mit diversen Sonderzeichen "§!§!"§&§&$§@@**'
    foo: "weitere sonderzeichen''''''"


einzelwert: blubb


Kombi-Typen:
    beispiel1: 'Ich bin ein Text'
    beispiel2:
        - 'Ich bin auch Text'
        - 'Ich bin erst recht Text'
    - 'Na und ich erst! Ich hab sogar Leerzeichen am Ende!    '

Die Elemente kann man natürlich jeweils schachteln und so auch komplexere Datenstrukturen darstellen. Ein etwas komplexeres und realitätsnahes Beispiel findet ihr z.B. in der Haupt-Config von pyChao.

Verwendung


Hier mal ein Codebeispiel in Python damit ihr seht wie einfach die Verwendung von Yaml-Daten ist:

import yaml
f =open('config.yml')
config = yaml.load(f.read())

wenn wir also mal annehmen wir hätten mit config.yml das Beispiel von oben ausgewählt, können wir jetzt z.B. mit config['Array'][2] dem Text 'eintrag3' erhalten und mit config['Kombi-Typen']['beispiel1'] den String 'Ich bin ein Text'.
Alles funktioniert wunderbar so, wie wir es von Python gewohnt sind und wir können ohne großen Programmieraufwand viel erreichen.

Andere Sprachen bringen andere Ansätze, so wandelt z.B. das PHP-Framework Symfony Yaml-Dateien automatisch in PHP-Quellcode um und aktualisiert diesen nur wenn sich etwas an der Datei geändert hat. Das gibt natürlich einen gewissen Geschwindigkeitsvorteil, außerdem ermöglicht es PHP-Code direkt im Yaml-Code zu verstecken. (Aber versucht bloß nicht solche Dateien dann unter Python, Ruby oder Javascript zu öffnen!)

Weiterführende Links:

Geschrieben von Dr. Azrael Tod