Qual é o uso do símbolo de tubo em YAML?


126

Eu sou novo no yaml e tenho uma pergunta sobre o símbolo de barra vertical (|) usado para várias linhas. YAML tem alguma sintaxe como a abaixo?

teste: | 6+

Dos dois arquivos YAML abaixo, o primeiro está funcionando e o segundo não. Eu não sei o que está causando isso.

Primeiro Arquivo

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

Segundo Arquivo

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

O segundo arquivo é do cliente.

Estou usando XMLBeans e recebo este erro:

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: Linha 17, coluna 12: Esperado um 'final de bloco', mas encontrado: início de mapeamento de bloco " .

Respostas:


178

O símbolo de barra vertical no final de uma linha em YAML significa que qualquer texto recuado que se segue deve ser interpretado como um valor escalar de várias linhas. Veja as especificações YAML .

Especificamente, a barra vertical indica que (exceto para o recuo) o valor escalar deve ser interpretado literalmente de forma a preservar as novas linhas. Por outro lado, o >caractere indica que segue o escalar "dobrado" de várias linhas, o que significa que as novas linhas são convertidas em espaços. Por exemplo:

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

A 6+parte é o indicador de indentação (uma especificação explícita de quantos espaços de indentação devem ser usados) com o "indicador de indentação" +que controla como os espaços em branco extras no final do literal escalar devem ser tratados.

O erro que você está obtendo é complicado: é porque a indentação deve ser relativa ao elemento de nível de bloco atual. Portanto, neste caso, deve ser em 4+vez de, 6+porque o último elemento de nível de bloco é o item da matriz (especificado por -) e o literal é 4 indentado a partir dele. Surpreendentemente, o final: |mapeamento não é considerado um elemento de bloco, embora seu valor seja multilinha. Faz sentido se você pensar a respeito - ainda é apenas um mapeamento "chave: valor" de uma linha. O valor simplesmente usa uma sintaxe especial para valores escalares multilinhas. Confuso, mas de alguma forma consistente ...


6
Quando você diz "quantas linhas de recuo devem ser usadas", você quer dizer caracteres de recuo (digamos, espaços)? Ou realmente linhas?
ROunofF

5
@ROunofF Resposta de uma criança de quatro anos e você é a primeira pessoa a apontar isso. Deve dizer "espaços de indentação". Eu vou consertar isso.
Iguananaut


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.