2012-03-12 18 views
28

estoy trabajando con la biblioteca YamlDotNet y yo estoy recibiendo este error al cargar un archivo YAML: Etiqueta¿Qué hace un solo signo de exclamación en YAML?

Al analizar una etiqueta, no se encontró esperaba URI.

Se supone que el archivo YAML está bien formado porque viene de right from 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 desde la especificación YAML que puede utilizar un signo de exclamación para indicar un objeto personalizado/tipo, y dos signos de exclamació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.

Respuesta

36

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

YAML specification 1.2 estancias (también 1.1): “!”

Al especificar explícitamente una propiedad de etiqueta no específica, el nodo continuación se resolverían a un “vainilla” secuencia, la cartografía, o una cadena, de acuerdo a su tipo.

Tome una mirada here a la etiqueta de "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é se YamlDotNet Lanzar 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é, tanto es muy similar, 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).

Presenta un problema al proyecto.

+0

Comentando el cheque parece solucionar el problema, pero no tengo idea de su efecto en otras construcciones. He archivado un error en el proyecto de todos modos. –

+1

¿sería equivalente envolver toda la cadena entre comillas en lugar de usar el signo de exclamación en el frente? – Magne

+1

enlaces a las especificaciones deben ser corregidos (1.1 - enlace a 1.2, 1.2 - enlaces a 1.1) – kovpack

Cuestiones relacionadas