What does a single exclamation mark do in YAML?

冷暖自知 提交于 2019-12-17 16:00:34

问题


I'm working with the YamlDotNet library and I'm getting this error when loading a YAML file:

While parsing a tag, did not find expected tag URI.

The YAML file is supposed to be well-formed because it comes right from RoR. The error seems to be triggered by this code:

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

I'm not an expert, but I see from the YAML spec that you can use an exclamation mark to indicate a custom object/type, and two exclamation marks to indicate an explicit built-in type.

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

However I haven't been able to find any reference to an exclamation mark used as above. What does that mean, and why the YAML library I use doesn't seem able to parse it? Note that if I remove those exclamation marks, the file is parsed fine.


回答1:


That "!" is the "non-specific tag".

YAML specification 1.2 stays (also 1.1):

By explicitly specifying a “!” non-specific tag property, the node would then be resolved to a “vanilla” sequence, mapping, or string, according to its kind.

Take a look here to the tag "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").

Why is YamlDotNet throwing a error? I can't be 100% sure, but I think you found a bug.

YamlDotNet is a port of LibYAML, so it's easy to compare sources.

Line 2635 of scanner.c (LibYAML):

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

Line 2146 of Scanner.cs (YamlDotNet ):

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

I know, both looks very similar, but at this point length is 1 and tag.Length is 0. Original C code takes care of the initial "!" (whole length) but C# doesn't do it (just the tag "name" length).

File an issue to the project.



来源:https://stackoverflow.com/questions/9664113/what-does-a-single-exclamation-mark-do-in-yaml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!