YAML中的管道符号有什么用途?

261

我刚接触yaml,关于竖线符号(|)用于多行的问题有疑问。YAML是否有以下语法结构?

test: |6+

以下是两个YAML文件,第一个可以运行,第二个不能运行。我不知道原因是什么。

第一个文件

Name :
  -
   testing:
     val1
  -
   second:
     val2
  -
   third:
     val3
  -
   then
  - 
    final: |
     a
     aa
     aaa
     aaaa : 'test:'

第二个文件

Name :
  -
   testing:
     val1
  -
   second:
     val2
  -
   third:
     val3
  -
   then
  - 
    final: |6+
      a
      aa
      aaa
      aaaa : 'test:'

第二个文件是客户的。

我正在使用XMLBeans,遇到以下错误:

com.esotericsoftware.yamlbeans.parser.Parser$ParserException: Line 17, column 12: Expected a 'block end' but found: block mapping start"

2个回答

339
在YAML中,一行末尾的竖线符号表示其后面所有缩进的文本都应被解释为多行标量值。详见YAML规范。具体而言,该竖线表示(除了缩进)标量值应该以字面的方式被解释,从而保留换行符。相反,大于号(>)则表示后面将跟随多行“折叠”标量,这意味着换行符会被转换为空格。例如:
>>> import yaml
>>> yaml.load("""
... |
...  This is a multi-line
...  literal style scalar.
... """)
'This is a multi-line\nliteral style scalar.\n'
>>> yaml.load("""
... >
...  This is a multi-line
...  folded scalar; new lines are folded into
...  spaces.
... """)
'This is a multi-line folded scalar; new lines are folded into spaces.\n'

6+是缩进指示器(明确指定应使用多少个空格进行缩进),带有“吞噬指示器”+,该指示器控制如何处理标量文字字面值末尾的额外空格。

你遇到的错误比较棘手:这是因为缩进应相对于当前块级元素。所以在这种情况下它应该是 2+ 而不是 6+ ,因为最后一个块级元素是映射 final:,而且文字字面值与它的缩进是 2。 已更新并根据 @bramvi 的纠正进行了更正。


4
也可以参考这个网址:在YAML中如何将一个字符串分成多行? - Oliver
2
所以在这种情况下,应该是4+而不是6+。我认为应该是2,而不是4,因为那是相对缩进。在“pyyaml 6.0”上进行了测试。 - bravmi
2
@bravmi 很好的发现。这个答案已经有8年了,之前没有人指出来过。我同意。 - Iguananaut
我不记得为什么我对4+的调整是基于final:不是块元素。它显然是。如果没有{...},它就不是流样式映射。 - Iguananaut
定义多行标量:动态大小的多行字符串。在 JavaScript 中,这仅被称为字符串。 https://eemeli.org/yaml-playground/ - Ray Foss

43

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接