Что делает один восклицательный знак в YAML?
Я работаю с YamlDotNet библиотека и я получаю эту ошибку при загрузке файла YAML:
при разборе тега не найден ожидаемый URI тега.
файл YAML должен быть хорошо сформирован, потому что он приходит справа от RoR. Ошибка, похоже, вызвана этим кодом:
formats:
default: ! '%d-%m-%Y'
long: ! '%d %B, %Y'
short: ! '%d %b'
Я не эксперт, но я вижу из спецификации YAML, что вы можете использовать восклицательный знак для обозначения пользовательский объект / тип и два восклицательных знака для указания явного встроенного типа.
obj1: !custom # whatever
obj2: !!str "My string"
однако я не смог найти никакой ссылки на восклицательный знак, используемый, как указано выше. Что это значит, и почему библиотека YAML, которую я использую, не может ее разобрать? Обратите внимание, что если я удалю эти восклицательные знаки, файл будет проанализирован нормально.
1 ответов
Это "!"это" неспецифический тег".
YAML спецификация 1.2 остается (кроме 1.1):
, указав "!"неспецифическое свойство тега, узел затем будет разрешена" ванильная " последовательность, сопоставление или строка, по своему виду.
посмотреть здесь к тегу "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").
почему YamlDotNet выдает ошибку? Я не могу быть на 100% уверен, но я думаю, что вы нашли ошибку.
YamlDotNet является портом LibYAML, поэтому легко сравнить источников.
линия 2635 сканера.c (LibYAML):
/* Check if the tag is non-empty. */
if (!length) {
линия 2146 сканера.cs (YamlDotNet):
// Check if the tag is non-empty.
if (tag.Length == 0)
Я знаю, оба выглядят очень похожими, но на данный момент length
1 и tag.Length
равен 0. Оригинальный код C позаботится о начальном "!"(вся длина), но C# этого не делает (только тег " name" длина.)
файл проблема для проекта.