Какая польза от символа трубы в YAML?

126

Я новичок в yaml, и у меня есть вопрос о символе вертикальной черты (|), используемом для нескольких строк. Есть ли в YAML синтаксис, подобный приведенному ниже?

тест: | 6+

Из двух файлов YAML, представленных ниже, первый работает, а второй - нет. Я не знаю, чем это вызвано.

Первый файл

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

Второй файл

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

Второй файл - заказчик.

Я использую XMLBeans и получаю такую ​​ошибку:

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: Строка 17, столбец 12: Ожидается конец блока, но найдено: начало отображения блока » .

Мэтт Лайонс
источник

Ответы:

179

Символ вертикальной черты в конце строки в YAML означает, что любой последующий текст с отступом должен интерпретироваться как многострочное скалярное значение. См. Спецификацию YAML .

В частности, вертикальная черта указывает, что (за исключением отступа) скалярное значение следует интерпретировать буквально таким образом, чтобы сохранить новые строки. И наоборот, >символ указывает, что следует многострочный "свернутый" скаляр, означающий, что новые строки преобразуются в пробелы. Например:

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

Эта 6+часть представляет собой индикатор отступа (явное указание того, сколько пространств для отступа следует использовать) с «индикатором пережевывания», +который контролирует, как следует обрабатывать лишние пробелы в конце скалярного литерала.

Ошибка, которую вы получаете, является сложной: это потому, что отступ должен быть относительно текущего элемента уровня блока. Таким образом, в этом случае это должно быть 4+вместо того, 6+потому что последний элемент уровня блока - это элемент массива (указанный -), а литерал имеет отступ 4 от него. Как ни странно, final: |отображение не считается блочным элементом, даже если его значение является многострочным. Если задуматься, в этом есть смысл - это всего лишь однострочное сопоставление «ключ: значение». Значение просто использует специальный синтаксис для многострочных скалярных значений. Непонятно, но как-то непротиворечиво ...

Iguananaut
источник
6
Когда вы говорите «сколько строк следует использовать для отступа», вы имеете в виду символы отступа (скажем, пробелы)? Или действительно линии?
ROunofF
5
@ROunofF Ответ четырехлетней давности, и вы первый, кто на это указал. Он должен сказать «отступы». Я исправлю это.
Iguananaut
1
Также посмотрите in-yaml-how-do-i-break-a-string-over-multiple-lines
Оливер,
3

Канал используется, когда вы хотите, чтобы строки новостей сохранялись как новые строки.

Для получения дополнительной информации: https://yaml-multiline.info/

freemanpolys
источник