Jakie jest zastosowanie symbolu potoku w YAML?


126

Jestem nowy w Yaml i mam pytanie dotyczące symbolu potoku (|) używanego w wielu liniach. Czy YAML ma składnię taką jak ta poniżej?

test: | 6+

Z dwóch poniższych plików YAML, pierwszy działa, a drugi nie. Nie wiem, co to powoduje.

Pierwszy plik

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

Drugi plik

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

Drugi plik należy do klienta.

Używam XMLBeans i otrzymuję ten błąd:

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: Wiersz 17, kolumna 12: Oczekiwano „końca bloku”, ale znaleziono: początek odwzorowania bloku ” .

Odpowiedzi:


178

Symbol pionowej kreski na końcu wiersza w YAML oznacza, że ​​każdy następujący po nim tekst z wcięciem powinien być interpretowany jako wieloliniowa wartość skalarna. Zobacz specyfikację YAML .

Konkretnie, potok wskazuje, że (z wyjątkiem wcięcia) wartość skalarna powinna być interpretowana dosłownie w taki sposób, aby zachować znaki nowej linii. I na odwrót, >znak wskazuje, że następuje wielowierszowy „zawinięty” skalar, co oznacza, że ​​znaki nowej linii są konwertowane na spacje. Na przykład:

>>> 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+Częścią jest wskaźnik wcięcie (wyraźne określenie w jaki sposób należy stosować wiele przestrzenie wcięcia) z „chomping wskaźnika” +, który określa, jak ekstra białe znaki na końcu skalarnego dosłownym powinny być obsługiwane.

Błąd, który otrzymujesz, jest trudny: dzieje się tak, ponieważ wcięcie powinno być względne do bieżącego elementu na poziomie bloku. Więc w tym przypadku powinno być 4+zamiast, 6+ponieważ ostatnim elementem na poziomie bloku jest element tablicy (określony przez -), a literał jest od niego wcięty o 4. Nieco zaskakujące jest to, że final: |odwzorowanie nie jest uważane za element blokowy, mimo że jego wartość jest wieloliniowa. To ma sens, jeśli się nad tym zastanowić - nadal jest to tylko „jednowierszowe” mapowanie „klucz: wartość”. Wartość po prostu używa specjalnej składni dla wieloliniowych wartości skalarnych. Mylące, ale w pewnym sensie spójne ...


6
Kiedy mówisz „ile linii wcięcia należy użyć”, czy masz na myśli znaki wcięcia (powiedzmy spacje)? Czy naprawdę linie?
ROunofF

5
@ROunofF Odpowiedź mam od czterech lat i jesteś pierwszą osobą, która to zauważyła. Powinien mówić „spacje wcięć”. Naprawię to.
Iguananaut


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.