2012-03-12 15 views
28

Pracuję z biblioteki YamlDotNet i dostaję ten błąd podczas ładowania pliku YAML:Co robi jeden wykrzyknik w YAML?

podczas parsowania znacznika, nie znaleźliśmy spodziewać tag URI.

Plik YAML powinien być dobrze sformułowany, ponieważ pochodzi right from RoR. Błąd wydaje się być wywołane przez ten kod:

formats: 
    default: ! '%d-%m-%Y' 
    long: ! '%d %B, %Y' 
    short: ! '%d %b' 

Nie jestem ekspertem, ale widzę ze spec YAML, które można wykorzystać wykrzyknik wskazać niestandardowego obiektu/typ, a dwa wykrzykniki wskazać jawny wbudowany typ.

obj1: !custom # whatever 
obj2: !!str "My string" 

Jednak nie udało mi się znaleźć żadnego odniesienia do wykrzyknika używanego jak powyżej. Co to znaczy i dlaczego biblioteka YAML, której używam, nie wydaje się zdolna do jej przeanalizowania? Zwróć uwagę, że jeśli usuniemy te wykrzykniki, plik zostanie przeanalizowany poprawnie.

Odpowiedz

36

To "!" to "niespecyficzny tag".

YAML specification 1.2 pobyty (także 1.1): „”

poprzez wyraźne określenie nieswoiste właściwość tag, węzeł by następnie zostać rozwiązane do „waniliowy” sekwencji, mapowania lub sznurka, według swego rodzaju.

Spójrz here do znacznika "gramatyki":

none : Unspecified tag (automatically resolved by application). 
'!'  : Non-specific tag (by default, "!!map"/"!!seq"/"!!str"). 
'!foo' : Primary (by convention, means a local "!foo" tag). 
'!!foo' : Secondary (by convention, means "tag:yaml.org,2002:foo"). 
'!h!foo': Requires "%TAG !h! <prefix>" (and then means "<prefix>foo"). 
'!<foo>': Verbatim tag (always means "foo"). 

Dlaczego YamlDotNet rzucanie błąd? Nie mogę być w 100% pewny, ale myślę, że znalazłeś błąd.

YamlDotNet to port LibYAML, więc łatwo porównać źródła.

Linia 2635 od scanner.c (LibYAML):

/* Check if the tag is non-empty. */ 
if (!length) { 

Linia 2146 od Scanner.cs (YamlDotNet):

// Check if the tag is non-empty. 
if (tag.Length == 0) 

Wiem, zarówno wygląda bardzo podobnie, ale w tym momencie length to 1, a tag.Length to 0. Oryginalny kod C zajmuje się początkowym "!" (cała długość), ale C# tego nie robi (tylko znacznik "nazwa" długość).

Złóż problem do projektu.

+0

Komentowanie czeku wydaje się naprawić problem, ale nie mam pojęcia o jego wpływie na inne konstrukty. W każdym razie zgłosiłem błąd w projekcie. –

+1

byłoby równoznaczne z zawijaniem całego ciągu znaków w cudzysłowie, zamiast używania pojedynczego wykrzyknika z przodu? – Magne

+1

linki do specyfikacji powinny zostać naprawione (1.1 - link do 1.2, 1.2 - linki do 1.1) – kovpack