我正在使用YamlDotNet库,我在加载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库似乎无法解析它?请注意,如果我删除这些感叹号,则文件解析正常。
答案 0 :(得分:45)
那个“!”是“非特定标签”。
YAML specification 1.2留下(也1.1):
通过显式指定“!”非特定标记属性,即节点 然后将被解析为“香草”序列,映射或字符串, 根据它的种类。
看一下here标签“grammar”:
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会抛出错误?我不能百分百肯定,但我认为你发现了一个错误。
YamlDotNet是LibYAML的端口,因此可以轻松比较来源。
scanner.c的第2635行(LibYAML):
/* Check if the tag is non-empty. */
if (!length) {
Scanner.cs的第2146行(YamlDotNet):
// Check if the tag is non-empty.
if (tag.Length == 0)
我知道,两者看起来非常相似,但此时length
为1而tag.Length
为0.原始C代码负责初始“!” (全长)但C#没有这样做(只是标签“名称”长度)。
向项目提交问题。