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

Matt Lyons
quelle

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 ...

Leguananaut
quelle
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
3

Die Pipe wird verwendet, wenn Newslines als Newlines beibehalten werden sollen.

Für weitere Informationen: https://yaml-multiline.info/

freemanpolys
quelle