Apa gunanya simbol pipa di YAML?

126

Saya baru mengenal yaml, dan saya memiliki pertanyaan tentang simbol pipa (|) yang digunakan untuk beberapa baris. Apakah YAML memiliki sintaks seperti di bawah ini?

tes: | 6+

Dari dua file YAML di bawah ini, yang pertama berfungsi dan yang kedua tidak. Saya tidak tahu apa yang menyebabkan ini.

File Pertama

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

File Kedua

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

File kedua adalah pelanggan.

Saya menggunakan XMLBeans dan saya mendapatkan kesalahan ini:

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: Baris 17, kolom 12: Diharapkan 'block end' tetapi ditemukan: pemetaan blok mulai " .

Matt Lyons
sumber

Jawaban:

178

Simbol pipa di akhir baris di YAML menandakan bahwa teks yang diindentasi setelahnya harus diinterpretasikan sebagai nilai skalar multi-baris. Lihat spesifikasi YAML .

Secara khusus, pipa menunjukkan bahwa (kecuali untuk indentasi) nilai skalar harus diinterpretasikan secara harfiah sedemikian rupa untuk mempertahankan baris baru. Sebaliknya, >karakter menunjukkan bahwa skalar "lipat" multi-baris mengikuti, yang berarti bahwa baris baru diubah menjadi spasi. Sebagai contoh:

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

Bagian 6+adalah indikator indentasi (spesifikasi eksplisit tentang berapa banyak ruang indentasi yang harus digunakan) dengan "indikator chomping" +yang mengontrol bagaimana spasi ekstra di akhir literal skalar harus ditangani.

Kesalahan yang Anda dapatkan cukup rumit: Itu karena lekukan harus relatif terhadap elemen level blok saat ini. Jadi dalam kasus ini seharusnya 4+bukan 6+karena elemen level blok terakhir adalah item array (ditentukan oleh -) dan literal diberi indentasi 4 darinya. Agak mengherankan jika final: |pemetaan tidak dianggap sebagai elemen blok meskipun nilainya berlapis-lapis. Agak masuk akal jika Anda memikirkannya - ini masih hanya pemetaan "kunci: nilai" 'satu baris'. Nilainya kebetulan menggunakan sintaks khusus untuk nilai skalar banyak baris. Membingungkan, tetapi entah bagaimana konsisten ...

Iguananaut
sumber
6
Saat Anda mengatakan "berapa banyak baris indentasi yang harus digunakan", yang Anda maksud adalah karakter indentasi (misalkan spasi)? Atau benar-benar garis?
ROunofF
5
@ROunofF Jawaban berusia empat tahun dan Anda adalah orang pertama yang menunjukkan hal itu. Ini harus mengatakan "spasi indentasi". Saya akan memperbaikinya.
Iguananaut
3

Pipa digunakan saat Anda ingin baris berita disimpan sebagai baris baru.

Untuk informasi lebih lanjut: https://yaml-multiline.info/

freemanpolys
sumber