¿Cuál es el uso del símbolo de tubería en YAML?

126

Soy nuevo en yaml y tengo una pregunta sobre el símbolo de tubería (|) que se usa para varias líneas. ¿YAML tiene alguna sintaxis como la siguiente?

prueba: | 6+

De los dos archivos YAML a continuación, el primero funciona y el segundo no. No sé qué está causando esto.

Primer archivo

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

Segundo archivo

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

El segundo archivo es del cliente.

Estoy usando XMLBeans y obtengo este error:

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: Línea 17, columna 12: Se esperaba un 'final de bloque' pero se encontró: inicio de mapeo de bloque " .

Matt Lyons
fuente

Respuestas:

178

El símbolo de barra vertical al final de una línea en YAML significa que cualquier texto con sangría que sigue debe interpretarse como un valor escalar de varias líneas. Consulte las especificaciones de YAML .

Específicamente, la barra vertical indica que (excepto por la sangría) el valor escalar debe interpretarse literalmente de tal manera que conserve las nuevas líneas. Por el contrario, el >carácter indica que sigue el escalar "plegado" de varias líneas, lo que significa que las nuevas líneas se convierten en espacios. Por ejemplo:

>>> 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 es el indicador de sangría (una especificación explícita de cuántos espacios de sangría deben usarse) con el "indicador de mordida"+ que controla cómo se deben manejar los espacios en blanco adicionales al final del literal escalar.

El error que está recibiendo es complicado: es porque la sangría debe ser relativa al elemento actual a nivel de bloque. Entonces, en este caso debería ser en 4+lugar de 6+porque el último elemento a nivel de bloque es el elemento de la matriz (especificado por -) y el literal tiene una sangría 4 de él. Sorprendentemente, el final: |mapeo no se considera un elemento de bloque a pesar de que su valor tiene varias líneas. Tiene sentido si lo piensas - sigue siendo sólo un mapeo "clave: valor" de una sola línea. El valor simplemente usa una sintaxis especial para valores escalares multilínea. Confuso, pero de alguna manera consistente ...

Iguananaut
fuente
6
Cuando dice "cuántas líneas de sangría deben usarse", ¿se refiere a caracteres de sangría (digamos espacios)? ¿O realmente líneas?
Vuelta al
5
@ROunofF Respuesta de un niño de cuatro años y usted es la primera persona en señalarlo. Debería decir "espacios de sangría". Yo arreglaré eso.
Iguananaut
3

La canalización se utiliza cuando desea que las líneas de noticias se mantengan como nuevas líneas.

Para más información: https://yaml-multiline.info/

freemanpolys
fuente