2011-01-19 8 views
9

Estoy construyendo un documento XML con REXML, y quiero imprimir texto de una manera particular. El documento es una lista de etiquetas CuePoint, y las que he generado con Element.new y add_element están mezcladas en una única línea como esta: (stackoverflow las ha dividido en dos líneas aquí, pero imagina lo siguiente está todo en una línea):Rexml - bonita impresión con etiquetas de texto en línea y secundarias sangradas

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

Cuando les salve a presentar, quiero que se ven así:

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

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

traté de pasar la función .write un valor de 2, para sangrar ellos: esto produce lo siguiente:

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> 

Esto es indeseable porque se ha insertado un espacio en blanco en el contenido de las etiquetas que se acaban de texto. es decir, el contenido de la etiqueta Nombre ahora es "\ n inst_50 \ n" o algo así. Esto va a explotar la aplicación que lee el xml.

¿Alguien sabe cómo puedo formatear el archivo de salida como quiero?

agradecido por cualquier consejo, máx

EDITAR - Me acaba de encontrar la respuesta en rubí foro, a través de otro 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,"")} 

Esto produce resultados como

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

No hay línea adicional entre las etiquetas CuePoint, pero eso está bien para mí. Dejaré esta pregunta aquí en caso de que alguien más se tropiece con ella.

Respuesta

17

Debe establecer la propiedad compacta del formateador en verdadero, pero solo puede hacerlo configurando primero un objeto formateador por separado, luego utilizándolo para escribir, en lugar de llamar al método de escritura del documento.

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

Gracias dmarkow, esto fue lo mismo que pensé después de publicar (ver mi edición). –

+2

Tenga en cuenta que también debe establecer 'formatter.width = ' si desea evitar que las líneas más largas de nodos de texto se envuelvan. –

Cuestiones relacionadas