Яке використання символу труби в 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: Очікуваний "кінцевий блок", але знайдено: початок блокування відображення " .

Відповіді:


178

Символ труби в кінці рядка в 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: |відображення не вважається блоковим елементом, хоча його значення є багаторівневим. Це начебто має сенс, якщо ви подумаєте про це - це все ще просто "однолінійне" зіставлення "ключ: значення". Значення просто відбувається за допомогою спеціального синтаксису для багаторядкових скалярних значень. Конфузно, але якось послідовно ...


6
Коли ви говорите "скільки рядків відступу слід використовувати", ви маєте на увазі символи відступу (скажімо пробіли)? Або справді лінії?
ROunofF

5
@ROunofF Чотирирічна відповідь, і ти перший, хто на це звернувся. Слід сказати «пробіли відступу». Я це виправлю.
Ігуананавт


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.