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

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


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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.