Pregunta ¿Qué hace un solo signo de exclamación en YAML?


Estoy trabajando con el YamlDotNet biblioteca y obtengo este error al cargar un archivo YAML:

Al analizar una etiqueta, no se encontró el URI de etiqueta esperado.

Se supone que el archivo YAML está bien formado porque viene desde RoR. El error parece ser desencadenado por este código:

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

No soy un experto, pero veo en la especificación YAML que puede usar un signo de admiración para indicar un objeto / tipo personalizado y dos signos de admiración para indicar un tipo incorporado explícito.

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

Sin embargo, no he podido encontrar ninguna referencia a un signo de exclamación utilizado como se indica anteriormente. ¿Qué significa eso y por qué la biblioteca YAML que uso no parece poder analizarlo? Tenga en cuenta que si elimino esos signos de admiración, el archivo se analiza correctamente.


32
2018-03-12 08:59


origen


Respuestas:


Ese "!" es la "etiqueta no específica".

Especificación YAML 1.2 estancias (también 1.1)

Al especificar explícitamente una propiedad de etiqueta no específica "!", El nodo   luego se resolvería con una secuencia "vainilla", mapeo o cadena,   de acuerdo a su tipo.

Echar un vistazo aquí a la etiqueta "gramática":

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").

¿Por qué YamlDotNet arroja un error? No puedo estar 100% seguro, pero creo que encontraste un error.

YamlDotNet es un puerto de LibYAML, por lo que es fácil comparar las fuentes.

Línea 2635 de scanner.c (LibYAML):

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

Línea 2146 de Scanner.cs (YamlDotNet):

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

Lo sé, ambos se ven muy similares, pero en este momento length es 1 y tag.Length es 0. El código C original se ocupa de la inicial "!" (toda la longitud) pero C # no lo hace (solo la etiqueta "nombre" de longitud).

Archivar un problema al proyecto.


37
2018-03-14 14:03