Ich hätte gerne YAML-Dateien mit einem include, ähnlich dieser Frage, aber mit Snakeyaml: Wie kann ich eine YAML-Datei in eine andere einfügen?
Zum Beispiel:
%Vor%Ich habe viel Ärger damit. Ich habe den Konstruktor definiert und kann ein Dokument importieren, aber nicht zwei. Der Fehler, den ich bekomme, ist:
%Vor%Mit einem Include freut sich Snakeyaml, dass es ein EOF findet und den Import bearbeitet. Mit zwei ist es nicht glücklich (oben).
Meine Java-Quelle ist:
%Vor%Frage ist, hat jemand eine ähnliche Sache mit Snakeyaml gemacht? Irgendwelche Gedanken darüber, was ich falsch machen könnte?
Ich sehe zwei Probleme:
%Vor% Sie sollten yaml.load(input)
, nicht yaml.loadAll(input)
verwenden. Die Methode loadAll()
gibt mehrere Objekte zurück, aber die Methode construct()
erwartet die Rückgabe eines einzelnen Objekts.
Das andere Problem ist, dass Sie mit der Art und Weise, wie die YAML-Verarbeitungspipeline funktioniert:
Wenn Sie denken, dass Ihr !include
wie in C funktioniert, wo der Präprozessor den Inhalt der enthaltenen Datei festhält, wäre die Implementierung in der Präsentationsstufe (Parsing) oder Serialisierung (Composing) . Aber Sie haben es in der Darstellungsphase (Konstruieren) implementiert, so dass !include
ein Objekt zurückgibt und die Struktur Ihrer YAML-Datei konsistent sein muss.
Nehmen wir an, Sie haben folgende Dateien:
test1a.yaml
%Vor%test1b.yaml
%Vor%test1.yaml
%Vor%Dies würde funktionieren und wäre äquivalent zu
%Vor%Aber die folgende Datei würde nicht funktionieren:
%Vor%weil es nichts zu sagen gibt, wie man die beiden Werte in einer größeren Hierarchie kombiniert. Sie müssen dies tun, wenn Sie ein Array wollen:
%Vor%oder wiederum, behandeln Sie diese benutzerdefinierte Logik in einer früheren Phase wie Parsing oder Composing.
Alternativ müssen Sie der YAML-Bibliothek mitteilen, dass Sie ein zweites Dokument starten (worüber sich der Fehler beschwert: expected '<document start>'
), da YAML mehrere "Dokumente" (Werte auf oberster Ebene) in einem einzigen Dokument unterstützt. Yaml-Datei.