9

REXMLを使用してxmlドキュメントを作成していて、特定の方法でテキストに出力したいと考えています。ドキュメントはCuePointタグのリストであり、Element.newとadd_elementで生成したタグはすべて、次のように1行にまとめられています(stackoverflowはここで2行に分割していますが、次のタグがすべてオンになっていると想像してください) 1行):

<CuePoint><Time>15359</Time><Type>event</Type><Name>inst_50</Name></CuePoint><CuePoint><Time>16359</Time><Type>event</Type><Name>inst_50</Name></CuePoint>

それらをファイルに保存するとき、私はそれらを次のように見せたいです:

<CuePoint>
  <Time>15359</Time>
  <Type>event</Type>
  <Name>inst_50</Name>
</CuePoint>

<CuePoint>
  <Time>16359</Time>
  <Type>event</Type>
  <Name>inst_50</Name>
</CuePoint>

.write関数に値2を渡して、それらをインデントしようとしました。これにより、次のようになります。

xml.write($stdout, 2) を生成します

<CuePoint>
  <Time>
    15359
  </Time>
  <Type>
    event
  </Type>
  <Name>
    inst_50
  </Name>
</CuePoint>
<CuePoint>
  <Time>
    16359
  </Time>
  <Type>
    event
  </Type>
  <Name>
    inst_50
  </Name>
</CuePoint>

テキストだけのタグの内容に空白が挿入されているため、これは不要です。つまり、Nameタグの内容は「\ ninst_50\n」などになります。これにより、xmlを読み取るアプリが爆破されます。

誰かが私がそれを望むように出力ファイルをフォーマットする方法を知っていますか?

アドバイスに感謝します、最大

編集-私は別のStackOverflow投稿を介してruby-forumで答えを見つけました:http ://www.ruby-forum.com/topic/195353

  formatter = REXML::Formatters::Pretty.new
  formatter.compact = true
  File.open(@xml_file,"w"){|file| file.puts formatter.write(xml.root,"")}

これにより、次のような結果が得られます

<CuePoint>
  <Time>33997</Time>
  <Type>event</Type>
  <Name>inst_45_off</Name>
</CuePoint>
<CuePoint>
  <Time>34080</Time>
  <Type>event</Type>
  <Name>inst_45</Name>
</CuePoint>

CuePointタグの間に余分な線はありませんが、それは私にとっては問題ありません。他の誰かがそれに遭遇した場合に備えて、私はこの質問をここに残しておきます。

4

1 に答える 1

18

フォーマッターのcompactプロパティをtrueに設定する必要がありますが、これを行うには、最初に別のフォーマッターオブジェクトを設定し、それを使用してドキュメント自体のwriteメソッドを呼び出すのではなく書き込みを行います。

formatter = REXML::Formatters::Pretty.new(2)
formatter.compact = true # This is the magic line that does what you need!
formatter.write(xml, $stdout)
于 2011-01-19T16:45:29.613 に答える