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

Max*_*Max 4 yaml

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

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

fly*_*lyx 8

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

\n\n
l-yaml-stream ::= l-document-prefix* l-any-document?\n                  ( l-document-suffix+ l-document-prefix* l-any-document?\n                  | l-document-prefix* l-explicit-document? )* \n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,由于 和l-document-prefix都是l-any-document可选的,所以空的 YAML 流是有效的 \xe2\x80\x93 但不包含 document

\n\n

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

\n\n

如果您想要一个包含一个文档的 YAML 流,该文档包含一个空标量作为根节点,您有以下选项:

\n\n
    \n
  • 如果您希望标量作为字符串加载,则最好使用空带引号的标量(""\'\')\xe2\x80\x93,因为未带引号的空标量应根据!!null规范中定义的架构解析。
  • \n
  • 明确的文件(---)。由于文档显式地以指令结束标记开始,因此允许没有内容,这在顶层被解释为空标量。
  • \n
  • 带有标记 ( ) 的显式文档--- !!str可确保空标量作为字符串加载。
  • \n
\n\n

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

\n