web-dev-qa-db-ja.com

YAMLでのパイプシンボルの使用とは何ですか?

私はyamlが初めてで、複数の行に使用されるパイプ記号(|)について質問があります。 YAMLには次のような構文がありますか?

テスト:| 6 +

以下の2つのYAMLファイルのうち、最初の1つは機能していますが、2つ目は機能していません。何が原因なのかわかりません。

最初のファイル

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

2番目のファイル

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

2番目のファイルは顧客のものです。

XMLBeansを使用していますが、次のエラーが表示されます。

com.esotericsoftware.yamlbeans.parser.Parser $ ParserException:行17、列12:「ブロック終了」が必要ですが、見つかった:ブロックマッピング開始」

87
user2053420

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+部分は、インデントインジケーター(インデントのスペース数を明示的に指定)で、スカラーリテラルの末尾の余分な空白を制御する「チョッピングインジケーター」+を使用します。処理されます。

発生しているエラーは扱いにくいものです。これは、インデントが現在のブロックレベル要素に関連している必要があるためです。したがって、この場合、最後のブロックレベル要素は配列項目(4+で指定)であり、リテラルはそこから4インデントされるため、6+ではなく-になります。多少驚いたことに、final: |マッピングは、その値が複数行であってもブロック要素とは見なされません。あなたがそれについて考えるならば、それはある意味理にかなっています-それはまだ「ワンライナー」の「キー:値」マッピングです。この値は、複数行のスカラー値に対して特別な構文を使用しているだけです。混乱しますが、どういうわけか一貫しています...

126
Iguananaut