空字符串是有效的YAML文档吗?

时间:2020-06-18 20:16:43

标签: yaml

  • 我有一个图书馆在加载空字符串('')时不返回任何文档,我想知道这是否是一个错误。
  • 我无法从YAML 1.2 specification(最近问这个问题)中推断出空字符串是否是有效的YAML文档。
  • 各种(在线)YAML验证程序至少需要一个字符来显示结果,例如YAMLValidator.comOnlineYAMLTools.com
  • YAMLLint.com接受一个空字符串作为输入,但是在验证后将输入文本更改为--- false,这引发了一个问题,即空字符串是否实际上是输入。

因此,通常来说,空字符串是有效的YAML文档吗?

1 个答案:

答案 0 :(得分:2)

解析器将YAML文件解析为 YAML流。一个YAML流可以包含多个文档。规范中对此流的定义如下:

l-yaml-stream ::= l-document-prefix* l-any-document?
                  ( l-document-suffix+ l-document-prefix* l-any-document?
                  | l-document-prefix* l-explicit-document? )* 

如您所见,由于l-document-prefixl-any-document都是可选的,因此空的YAML流有效-但不包含文档

如果您要问l-any-document是否可以产生空字符串,答案是否定的。如果没有起始---,则您有一个l-bare-document,其中必须至少包含一个节点。普通标量由ns-plain(n,c)产生,如果您降入该标量,您将注意到它必须至少包含ns-plain-first(c)产生的一个字符。

如果要让YAML流包含一个文档,该文档包含一个空标量作为根节点,则可以使用以下选项:

  • 带引号的空标量(""'')–如果希望将标量作为字符串加载,则最好,因为按照以下说明,无引号的空标量应解析为!!null规范中定义的架构。
  • 显式文档(---)。由于文档是从指令结束标记显式开始的,因此它可以不包含任何内容,该内容在顶层被解释为空标量。
  • 带有标签(--- !!str)的显式文档可确保将空标量作为字符串加载。

编辑:YAMLlint网站上的一条注释:不要使用它。它不会告诉您正在使用哪个实现,期望使用哪个YAML版本等。其输出表明,它将空输入解析为具有空标量的单个文档,并将该标量解析为布尔值false。尽管规范允许这样做(因为规范不会在实现时强制使用任何特定的架构),但它不符合任何正式方案。