2013-03-21 10 views
38

Jestem nowy dla yaml i mam pytanie. Symbol rury (|) używany do wielu linii. ma yaml mają składni jak poniżej?jaki jest pożytek z symbolu rury w yaml

Test: | 6+

mam kod jak poniżej yaml dwóch Pierwszy z nich działa, a drugi nie. Nie wiem, co się tam działo.
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:' 

P.S: Drugi plik jest klienta. Używam xmlbeans i mam "com.esotericsoftware.yamlbeans.parser.Parser $ ParserException: Linia 17, kolumna 12: Oczekiwano" końca bloku ", ale odnaleziono: rozpoczęcie mapowania bloków".

redakcją XMLBeans dodane blisko "używam".

Odpowiedz

67

Symbol rury na końcu wiersza w YAML oznacza, że ​​dowolny wcięty tekst, który następuje, powinien być interpretowany jako wielowierszowa wartość skalarna. Zobacz the YAML spec.

W szczególności, rura wskazuje, że (z wyjątkiem wcięcia) wartość skalarna powinna być interpretowana dosłownie w taki sposób, aby zachować nowe linie. I odwrotnie, znak > wskazuje, że wielowarstwowy "złożony" skalar następuje, co oznacza, że ​​nowe wiersze 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ęść jest wskaźnikiem wcięcie (wyraźne określenie, jak wiele przestrzeni wcięcia powinny być używane) z „chomping wskaźnika” + która kontroluje jak dodatkowe spacje na końcu skalar dosłowny należy obchodzić się z nim.

Błąd, który otrzymujesz, jest trudny: ponieważ wcięcia powinny być względne do bieżącego elementu blokowego. Tak więc w tym przypadku powinno być 4+ zamiast 6+, ponieważ ostatnim elementem blokowym jest element tablicy (określony przez -), a literał jest z niego wcięty 4. Nieco zaskakujące jest, że mapowanie final: | nie jest uważane za element blokowy, mimo że jego wartość jest wieloliniowa. Ma to sens, jeśli się nad tym zastanowić - to wciąż tylko "jedno-liniowe" "mapowanie klucza: wartość". Wartość po prostu przy użyciu specjalnej składni dla wielowierszowych wartości skalarnych. Mylące, ale jakoś konsekwentne ...

+0

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

+1

@ROunofF Czteroletnia odpowiedź i jesteś pierwszą osobą, która zwraca na to uwagę. Powinien powiedzieć "przestrzenie wcięcia". Naprawię to. – Iguananaut

+1

http://yaml-multiline.info/ ma kilka bardzo dobrych wyjaśnień z demo. –

Powiązane problemy