Was ist die Verwendung des Pipe-Symbols in YAML?


125

Ich bin neu in Yaml und habe eine Frage zum Rohrsymbol (|), das für mehrere Zeilen verwendet wird. Hat YAML eine Syntax wie die folgende?

Test: | 6+

Von den beiden folgenden YAML-Dateien funktioniert die erste und die zweite nicht. Ich weiß nicht, was das verursacht.

Erste Datei

Name :
  -
   testing:
     val1
  -
   second:
     val2
  -
   third:
     val3
  -
   then
  - 
    final: |
     a
     aa
     aaa
     aaaa : 'test:'

Zweite Datei

Name :
  -
   testing:
     val1
  -
   second:
     val2
  -
   third:
     val3
  -
   then
  - 
    final: |6+
      a
      aa
      aaa
      aaaa : 'test:'

Die zweite Datei gehört dem Kunden.

Ich verwende XMLBeans und erhalte folgende Fehlermeldung:

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: Zeile 17, Spalte 12: Erwartet ein 'Blockende', aber gefunden: Blockzuordnungsstart " .

Antworten:


177

Das Pipe-Symbol am Ende einer Zeile in YAML bedeutet, dass der folgende eingerückte Text als mehrzeiliger Skalarwert interpretiert werden sollte. Siehe die YAML-Spezifikation .

Insbesondere gibt die Pipe an, dass (mit Ausnahme der Einrückung) der Skalarwert wörtlich so interpretiert werden sollte, dass Zeilenumbrüche erhalten bleiben. Umgekehrt gibt das >Zeichen an, dass ein mehrzeiliger "gefalteter" Skalar folgt, was bedeutet, dass Zeilenumbrüche in Leerzeichen umgewandelt werden. Beispielsweise:

>>> import yaml
>>> yaml.load("""
... |
...  This is a multi-line
...  literal style scalar.
... """)
'This is a multi-line\nliteral style scalar.\n'
>>> yaml.load("""
... >
...  This is a multi-line
...  folded scalar; new lines are folded into
...  spaces.
... """)
'This is a multi-line folded scalar; new lines are folded into spaces.\n'

Das 6+ Teil ist der Einrückungsindikator (eine explizite Angabe, wie viele Einrückungsräume verwendet werden sollen) mit dem "Chomping-Indikator", +der steuert, wie zusätzliche Leerzeichen am Ende des Skalarliteral behandelt werden sollen.

Der Fehler, den Sie erhalten, ist schwierig: Der Einzug sollte relativ zum aktuellen Element auf Blockebene sein. In diesem Fall sollte dies 4+nicht der Fall sein, 6+da das letzte Element auf Blockebene das Array-Element (angegeben durch -) ist und das Literal 4 davon eingerückt ist. Es ist etwas überraschend, dass das final: |Mapping nicht als Blockelement betrachtet wird, obwohl sein Wert mehrzeilig ist. Es macht irgendwie Sinn, wenn Sie darüber nachdenken - es ist immer noch nur eine einzeilige Zuordnung von "Schlüssel: Wert". Der Wert verwendet zufällig eine spezielle Syntax für mehrzeilige Skalarwerte. Verwirrend, aber irgendwie konsequent ...


6
Wenn Sie sagen "Wie viele Zeilen Einrückung sollten verwendet werden", meinen Sie Einrückungszeichen (sagen wir Leerzeichen)? Oder wirklich Linien?
ROunofF

5
@ROunofF Vier Jahre alte Antwort und Sie sind die erste Person, die darauf hinweist. Es sollte "Einrückungsräume" heißen. Ich werde das beheben.
Iguananaut


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.