Việc sử dụng ký hiệu ống trong YAML là gì?


126

Tôi mới sử dụng yaml và tôi có câu hỏi về ký hiệu đường ống (|) được sử dụng cho nhiều đường. YAML có cú pháp nào giống như bên dưới không?

kiểm tra: | 6+

Trong số hai tệp YAML bên dưới, tệp đầu tiên đang hoạt động và tệp thứ hai thì không. Tôi không biết điều gì đang gây ra điều này.

Tệp đầu tiên

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

Tệp thứ hai

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

Tệp thứ hai là của khách hàng.

Tôi đang sử dụng XMLBeans và tôi gặp lỗi này:

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: Dòng 17, cột 12: Mong đợi một "kết thúc khối" nhưng đã tìm thấy: bắt đầu ánh xạ khối " .

Câu trả lời:


178

Biểu tượng dấu gạch ở cuối dòng trong YAML biểu thị rằng bất kỳ văn bản thụt lề nào theo sau phải được hiểu là một giá trị vô hướng nhiều dòng. Xem thông số kỹ thuật YAML .

Cụ thể, đường ống chỉ ra rằng (ngoại trừ thụt đầu dòng) giá trị vô hướng phải được hiểu theo nghĩa đen theo cách bảo toàn các dòng mới. Ngược lại, >ký tự chỉ ra rằng vô hướng nhiều dòng "gấp khúc" theo sau, nghĩa là các dòng mới được chuyển đổi thành dấu cách. Ví dụ:

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

Phần 6+này là chỉ báo thụt lề (đặc điểm kỹ thuật rõ ràng về số khoảng trắng của thụt lề nên được sử dụng) với "chỉ báo chomping" +kiểm soát cách xử lý khoảng trắng thừa ở cuối ký tự vô hướng.

Lỗi bạn đang gặp phải là một lỗi khó: Đó là vì thụt lề phải liên quan đến phần tử cấp khối hiện tại. Vì vậy, trong trường hợp này, nó nên là 4+thay 6+vì vì phần tử cấp khối cuối cùng là mục mảng (được chỉ định bởi -) và chữ được thụt vào 4 từ nó. Hơi ngạc nhiên là final: |ánh xạ không được coi là một phần tử khối mặc dù giá trị của nó là nhiều dòng. Sẽ rất hợp lý nếu bạn nghĩ về nó - nó vẫn chỉ là một ánh xạ 'một lớp lót' "key: value". Giá trị chỉ xảy ra khi sử dụng một cú pháp đặc biệt cho các giá trị vô hướng nhiều dòng. Khó hiểu, nhưng bằng cách nào đó nhất quán ...


6
Khi bạn nói "nên sử dụng bao nhiêu dòng thụt lề", ý bạn có phải là ký tự thụt lề (giả sử khoảng trắng) không? Hay dòng thực sự?
ROunofF

5
@ROunofF Câu trả lời cũ 4 tuổi và bạn là người đầu tiên chỉ ra điều đó. Nó sẽ nói "khoảng cách của thụt lề". Tôi sẽ sửa nó.
Iguananaut


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.