54

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 Answer 1

71
+100

That ! is the non-specific tag.

The YAML specification 1.2 (as well as the previous 1.1) says that :

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.

Sign up to request clarification or add additional context in comments.

5 Comments

Commenting the check seems to fix the problem, but I have no idea about its effect on other constructs. I've filed a bug on the project anyway.
would it be equivalent to wrap the entire string in quotation marks instead of using the single exclamation mark in front?
links to specifications should be fixed (1.1 - link to 1.2, 1.2 - links to 1.1)
The explanation is a little opaque. Do you have an example of using! (or any of the variants you mentioned)?
I'm agreed with Burhan, that's impossible to decipher without having more experience with YAML. This answer elaborates a little more on tags themselves: stackoverflow.com/a/17192241/828584

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.