2012-03-12 86 views
28

我與YamlDotNet庫工作,並加載YAML文件時,我收到此錯誤:YAML中的單個感嘆號有什麼作用?

在解析一個標籤,沒有找到預期標記URI。

YAML文件應該是格式良好的,因爲它來自right from RoR。錯誤似乎這段代碼觸發:

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

我不是專家,但我從YAML規範,您可以使用一個感嘆號,表示自定義對象/類型看,和兩個感嘆號以指示明確的內置類型。

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

但是,我一直沒有找到任何引用上面使用的感嘆號。這是什麼意思,以及爲什麼我使用的YAML庫似乎不能解析它?請注意,如果我刪除這些感嘆號,文件解析得很好。

回答

36

那個「!」是「非特定標籤」。

YAML specification 1.2停留(還1.1):「」

通過明確指定一個非特定的標籤屬性,節點 將被解析爲一個「香草」序列,映射,或字符串, 根據其種類。

看看here到標籤 「語法」:

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

爲什麼YamlDotNet拋出一個錯誤?我不能100%確定,但我認爲你發現了一個錯誤。

YamlDotNet是LibYAML的一個端口,因此很容易比較來源。

scanner.c的2635線(LibYAML):Scanner.cs(YamlDotNet)2146

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

線:

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

我知道,這兩個看起來非常相似,但在這一點length爲1且tag.Length爲0.原始C代碼負責初始「!」 (全長),但C#不這樣做(只是標籤「名稱」的長度)。

向該項目提出問題。

+0

評論檢查似乎解決了這個問題,但我不知道它對其他結構的影響。無論如何,我已經爲該項目提交了一個錯誤。 – 2012-03-15 14:16:46

+1

它會等同於將整個字符串換成引號而不是在前面使用單個感嘆號? – Magne 2015-02-05 22:12:00

+1

鏈接規範應該修復(1.1 - 鏈接到1.2,1.2 - 鏈接到1.1) – kovpack 2015-12-04 11:38:26