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

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


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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.