web-dev-qa-db-fra.com

À quoi sert le symbole de tuyau dans YAML?

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

test: | 6 +

Des deux fichiers YAML ci-dessous, le premier fonctionne et le second ne fonctionne 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é: début de mappage de bloc ".

87
user2053420

Le symbole de tuyau à 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 (à l'exception de l'indentation) la valeur scalaire doit être interprétée littéralement de manière à préserver les nouvelles lignes. Inversement, le > indique que le scalaire "plié" sur plusieurs lignes suit, ce qui signifie que les sauts de 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'

Le 6+ partie est l'indicateur d'indentation (une spécification explicite du nombre d'espaces d'indentation à utiliser) avec "l'indicateur de hachage" + 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, ce 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 est en retrait de 4. De façon assez surprenante, le final: | le mappage n'est pas considéré comme un élément de bloc même si sa valeur est multiligne. Cela a du sens si vous y réfléchissez - c'est toujours juste un mappage "clé: valeur" "à une ligne". Il se trouve que la valeur utilise simplement une syntaxe spéciale pour les valeurs scalaires multilignes. Confus, mais en quelque sorte cohérent ...

126
Iguananaut