YAML 中的单个感叹号有啥作用?

Posted

技术标签:

【中文标题】YAML 中的单个感叹号有啥作用?【英文标题】:What does a single exclamation mark do in YAML?YAML 中的单个感叹号有什么作用? 【发布时间】:2012-03-28 16:16:24 【问题描述】:

我正在使用 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 库似乎无法解析它?请注意,如果我删除了这些感叹号,则该文件被解析得很好。

【问题讨论】:

【参考方案1】:

!非特定标签

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 (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.Length 为 0。原始 C 代码处理了最初的“!” (全长)但 C# 不这样做(只是标签“名称”长度)。

向项目提交问题。

【讨论】:

评论检查似乎可以解决问题,但我不知道它对其他构造的影响。无论如何,我已经在该项目上提交了一个错误。 是否相当于将整个字符串用引号括起来而不是在前面使用单个感叹号? 规范的链接应该是固定的(1.1 - 链接到 1.2, 1.2 - 链接到 1.1) 解释有点不透明。您有使用!(或您提到的任何变体)的示例吗? 我同意 Burhan 的观点,如果没有更多的 YAML 经验,这是不可能破译的。这个答案详细说明了标签本身:***.com/a/17192241/828584

以上是关于YAML 中的单个感叹号有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

swift中问号和感叹号有啥区别?

如果有“!”,如何使用 PyYAML 解析 YAML在 YAML 中

php技术–php中感叹号!和双感叹号!!的用法(三元运算)

Python中感叹号的作用

yaml常用语法一

excel重感叹号(!)是啥意思