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


  • 我有一个库在加载空字符串(''(时没有返回任何文档,我想知道这是否是一个错误。
  • 我无法从 YAML 1.2 规范(最近提出此问题时(推断空字符串是否是有效的 YAML 文档。
  • 各种(在线(YAML 验证器需要至少一个字符来显示结果,例如 YAMLValidator.com 或 OnlineYAMLTools.com。
  • YAMLLint.com 接受空字符串作为输入,但在验证时将输入文本更改为--- false,从而引发空字符串是否实际上是输入的问题。

那么,一般来说,空字符串是有效的 YAML 文档吗?

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。虽然这是规范允许的(因为规范不会在实现上强制任何特定的模式(,但它不符合任何官方方案。

最新更新