YAMLでのパイプ記号の使用は何ですか?


126

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

テスト:| 6+

以下の2つのYAMLファイルのうち、最初のファイルは機能し、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:予想される「ブロック終了」は見つかりましブロックマッピング開始を」

回答:


178

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: |


6
「何行のインデントを使用する必要がある」と言うとき、インデント文字(スペースとしましょう)を意味しますか?それとも本当に線?
ROunofF 2017

5
@ROunofF 4年前の答えで、あなたはそれを最初に指摘した人です。「インデントのスペース」と言うべきです。直します。
イグアナナウ2017


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.