2011-02-28 11 views
8

Este es mi código Groovy:Cómo escribir un XML en un archivo, con solo una instancia de Parser?

// ... 
def xml = new XmlParser().parse(fileName) 
xml.each { e -> 
    // some changes are being made to XML 
    xml.append("test", "test me") 
} 
def writer = new FileWriter(newFileName) 
new XmlNodePrinter(new PrintWriter(writer)).print(xml) 

el código funciona, pero la salida XML tiene una gran cantidad de espacios en blanco innecesarios. Parece que estoy haciendo algo mal al escribir en el archivo.

ps. Gracias a Tim, esta es la forma en que debería funcionar (la última línea del ejemplo anterior se sustituye con estas tres líneas):

def printer = new XmlNodePrinter(new PrintWriter(writer)) 
printer.preserveWhitespace = true 
printer.print(xml) 

Respuesta

12

¿Qué pasa si se reemplaza:

def writer = new FileWriter(newFileName) 
new XmlNodePrinter(new PrintWriter(writer)).print(xml) 

con:

new File(newFilename).withWriter { out -> 
    printer = new XmlNodePrinter(out) 
    printer.preserveWhitespace = true 
    printer.print(xml) 
} 

- edición -

Como señaló, se siente como que debería ser preserveWhitespace = false, sin embargo, si se intenta el siguiente código de prueba:

def x = """<langs type="current"> 
    <language>Java</language> 
    <language>Groovy</language> 
    <language>JavaScript</language> 
</langs>""" 

def xml = new XmlParser().parseText(x) 
xml.appendNode 'language', 'Ruby' 

def printIt = { node, pw -> 
    println "With preserveWhitespace=$pw:" 
    def s = new StringWriter() 
    printer = new XmlNodePrinter(new PrintWriter(s)) 
    printer.preserveWhitespace = pw 
    printer.print(xml) 
    println s 
} 

printIt xml, true 
printIt xml, false 

Se obtiene la salida:

With preserveWhitespace=true: 
<langs type="current"> 
    <language>Java</language> 
    <language>Groovy</language> 
    <language>JavaScript</language> 
    <language>Ruby</language> 
</langs> 

With preserveWhitespace=false: 
<langs type="current"> 
    <language> 
    Java 
    </language> 
    <language> 
    Groovy 
    </language> 
    <language> 
    JavaScript 
    </language> 
    <language> 
    Ruby 
    </language> 
</langs> 
+0

Si el problema es que tiene demasiado espacio en blanco en su salida, ¿no debería usar 'preserveWhitespace = false'? – pmartin

+0

@pmartin agregó un ejemplo –

+0

gracias. Resumí tu respuesta dentro de mi pregunta :) No entendí por qué tiene que ser tan largo (la respuesta), pero de todos modos, muchas gracias. – yegor256

0

terminé con esta propaganda:

new File(myFilename).withWriter { 
    def printer = new XmlNodePrinter(new PrintWriter(it)) 
    printer.preserveWhitespace = true 
    printer.print(myXmlNode) 
} 
Cuestiones relacionadas