2012-03-12 810 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