47

我正在使用YamlDotNet库,加载 YAML 文件时出现此错误:

解析标签时,未找到预期的标签 URI。

YAML 文件应该是格式正确的,因为它来自 RoR。该错误似乎是由以下代码触发的:

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

我不是专家,但我从 YAML 规范中看到,您可以使用感叹号表示自定义对象/类型,使用两个感叹号表示明确的内置类型。

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

但是,我无法找到对上述使用的感叹号的任何引用。这是什么意思,为什么我使用的 YAML 库似乎无法解析它?请注意,如果我删除这些感叹号,则文件解析得很好。

4

1 回答 1

61

!是非特定标签

YAML 规范 1.2(以及之前的1.1 说:

通过明确指定“!” 非特定标签属性,然后节点将根据其类型被解析为“vanilla”序列、映射或字符串。

看看这里的标签“语法”:

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 (LibYAML) 的第 2635 行:

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

Scanner.cs (YamlDotNet) 的第 2146 行:

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

我知道,两者看起来非常相似,但此时length是 1 和tag.Length0。原始 C 代码负责处理初始的“!” (全长)但 C# 不这样做(只是标签“名称”长度)。

向项目提交问题。

于 2012-03-14T14:03:45.417 回答