Qual è l'uso del simbolo della pipa in YAML?


126

Sono nuovo di yaml e ho una domanda sul simbolo pipe (|) utilizzato per più righe. YAML ha una sintassi come quella qui sotto?

test: | 6+

Dei due file YAML di seguito, il primo funziona e il secondo no. Non so cosa lo stia causando.

Primo file

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

Secondo file

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

Il secondo file è quello del cliente.

Sto usando XMLBeans e ottengo questo errore:

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: riga 17, colonna 12: era prevista una "fine blocco" ma trovato: inizio mappatura blocco " .

Risposte:


178

Il simbolo della barra verticale alla fine di una riga in YAML significa che qualsiasi testo rientrato che segue deve essere interpretato come un valore scalare su più righe. Vedi le specifiche YAML .

In particolare, la barra verticale indica che (tranne che per il rientro) il valore scalare deve essere interpretato letteralmente in modo tale da preservare i caratteri di ritorno a capo. Al contrario, il >carattere indica che segue lo scalare "piegato" su più righe, il che significa che le nuove righe vengono convertite in spazi. Per esempio:

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

La 6+parte è l'indicatore di indentazione (una specifica esplicita di quanti spazi di indentazione dovrebbero essere usati) con l '"indicatore di chomping" +che controlla come devono essere gestiti gli spazi bianchi extra alla fine del letterale scalare.

L'errore che stai ricevendo è complicato: è perché il rientro dovrebbe essere relativo all'attuale elemento a livello di blocco. Quindi in questo caso dovrebbe essere 4+invece che 6+perché l'ultimo elemento a livello di blocco è l'elemento dell'array (specificato da -) e il letterale è rientrato di 4 da esso. Sorprendentemente, la final: |mappatura non è considerata un elemento di blocco anche se il suo valore è a più righe. Ha senso se ci pensi - è ancora solo una mappatura "chiave: valore" di una riga. Il valore sta semplicemente usando una sintassi speciale per valori scalari multilinea. Confuso, ma in qualche modo coerente ...


6
Quando dici "quante righe di rientro dovrebbero essere usate", intendi caratteri di rientro (diciamo spazi)? O davvero le linee?
ROunofF

5
@ROunofF Risposta di un bambino di quattro anni e sei la prima persona a farlo notare. Dovrebbe dire "spazi di rientro". Lo aggiusterò.
Iguananaut


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.