.net parsing tags yaml yamldotnet

.net - ¿Qué hace un solo signo de exclamación en YAML?



parsing tags (1)

Estoy trabajando con la biblioteca YamlDotNet y recibo 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 directamente de 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.


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

YAML especificación 1.2 permanece (también 1.1 ):

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

Eche un vistazo here 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 punto, la length es 1 y la length de la 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.