2011-01-19 6 views
9

Sto costruendo un documento xml con REXML e desidero eseguire l'output in testo in un modo particolare. Il doc è un elenco di tag CuePoint, e quelli che ho generato con Element.new e add_element sono tutti riuniti in un'unica riga come questa: (StackOverflow li ha divisi su due righe qui ma immagina quanto segue è tutto su una riga):Rexml - bella stampa con testo inline e tag figlio rientrati

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

quando salvo fuori di file, voglio che appaiono così:

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

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

ho provato passando la funzione .write un valore pari a 2, per il rientro loro: questo produce quanto segue:

xml.write($stdout, 2) produce

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

Questo è indesiderabile perché ha inserito uno spazio nel contenuto dei tag, che hanno solo il testo. cioè il contenuto del tag Name ora è "\ n inst_50 \ n" o qualcosa del genere. Questo farà esplodere l'app che legge l'xml.

Qualcuno sa come posso formattare il file di output nel modo in cui lo voglio?

grato per qualsiasi consiglio, max

EDIT - Ho appena trovato la risposta su Ruby-forum, tramite un altro post 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,"")} 

Questo produce risultati come

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

Non c'è una linea in più tra i tag CuePoint, ma per me va bene. Lascio questa domanda qui nel caso in cui qualcun altro si imbatta in esso.

risposta

17

È necessario impostare la proprietà compatta del formattatore su true, ma è possibile farlo solo impostando prima un oggetto formattatore separato, quindi usando quello per scrivere invece di chiamare il metodo di scrittura del documento stesso.

formatter = REXML::Formatters::Pretty.new(2) 
formatter.compact = true # This is the magic line that does what you need! 
formatter.write(xml, $stdout) 
+0

Grazie dmarkow, questo era lo stesso che ho capito dopo la pubblicazione (vedi la mia modifica). –

+2

Nota che devi anche impostare 'formatter.width = ' se vuoi evitare che le linee di nodi di testo più lunghe vengano avvolte. –