2011-01-19 10 views
9

私はREXMLを使用してXML文書を構築しており、特定の方法でテキストに出力したいと考えています。ドキュメントはCuePointタグのリストであり、Element.newとadd_elementで生成したものはすべて次のように1行に集約されています:(stackoverflowは2行に分割していますが、 1行):Rexml - テキストインラインと子タグのインデント付きのきれいなプリント

<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タグの内容は現在 "\ n inst_50 \ n"または何かになります。これは、XMLを読み取るアプリケーションを爆破するつもりです。

誰も私がそれを望む方法で出力ファイルをフォーマットする方法を知っていますか?何かアドバイスのため

感謝し、最大

EDIT - 私はちょうど別のStackOverflowのポストを経由して、ルビー・フォーラムで答えを見つけました: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タグの間に余分な行はありませんが、それは私にとっては大丈夫です。他の誰かがそれを突き抜けた場合、私はこの質問をここに残しています。

答えて

17

フォーマッタの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) 
+0

ありがとうdmarkow、これは私が投稿した後にわかったのと同じでした(自分の編集を参照)。 –

+2

長いテキスト行が折り返されないようにするには、 'formatter.width = 'も設定する必要があることに注意してください。 –

関連する問題