À quoi sert le symbole de tuyau dans YAML?

126

Je suis nouveau sur yaml et j'ai une question sur le symbole de tuyau (|) utilisé pour plusieurs lignes. YAML a-t-il une syntaxe similaire à celle ci-dessous?

test: | 6+

Parmi les deux fichiers YAML ci-dessous, le premier fonctionne et le second ne l'est pas. Je ne sais pas ce qui cause cela.

Premier fichier

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

Deuxième fichier

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

Le deuxième fichier est celui du client.

J'utilise XMLBeans et j'obtiens cette erreur:

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: Ligne 17, colonne 12: Attendu une 'fin de bloc' mais trouvée: début de mappage de bloc " .

Matt Lyons
la source

Réponses:

178

Le symbole de tube à la fin d'une ligne en YAML signifie que tout texte en retrait qui suit doit être interprété comme une valeur scalaire multiligne. Voir la spécification YAML .

Plus précisément, le tube indique que (sauf pour l'indentation) la valeur scalaire doit être interprétée littéralement de manière à préserver les nouvelles lignes. Inversement, le >caractère indique que le scalaire «plié» multiligne suit, ce qui signifie que les retours à la ligne sont convertis en espaces. Par exemple:

>>> 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+partie est l'indentation d'indentation (une spécification explicite du nombre d'espaces d'indentation à utiliser) avec l '"indicateur de chomping" +qui contrôle comment les espaces supplémentaires à la fin du littéral scalaire doivent être gérés.

L'erreur que vous obtenez est délicate: c'est parce que l'indentation doit être relative à l'élément de niveau bloc actuel. Donc, dans ce cas, il devrait être 4+au lieu de 6+car le dernier élément de niveau bloc est l'élément de tableau (spécifié par- ) et le littéral en est indenté 4. De manière assez surprenante, le final: |mappage n'est pas considéré comme un élément de bloc même si sa valeur est multi-lignes. Cela a du sens si vous y réfléchissez - il s'agit toujours d'un mappage «clé: valeur» «à une ligne». La valeur utilise simplement une syntaxe spéciale pour les valeurs scalaires multilignes. Confus, mais en quelque sorte cohérent ...

Iguananaut
la source
6
Quand vous dites "combien de lignes d'indentation devraient être utilisées", voulez-vous dire des caractères d'indentation (disons des espaces)? Ou vraiment des lignes?
ROunofF
5
@ROunofF Réponse de quatre ans et vous êtes la première personne à le signaler. Il devrait dire "espaces d'indentation". Je vais réparer ça.
Iguananaut
3

Le tube est utilisé lorsque vous souhaitez que les newslines soient conservées en tant que nouvelles lignes.

Pour plus d'informations: https://yaml-multiline.info/

freemanpolys
la source