How to write an XML file using only a Parser instance?

This is my Groovy code:

// ... 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) 

The code works, but the XML output has a lot of extra spaces. It looks like I'm doing something wrong with writing to a file.

ps. Thanks to Tim, here's how it should work (the last line of the above example should be replaced with these three lines):

 def printer = new XmlNodePrinter(new PrintWriter(writer)) printer.preserveWhitespace = true printer.print(xml) 
+8
xml groovy
source share
2 answers

What happens if you replace:

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

from:

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

- change -

As indicated, it seems like it should be preserveWhitespace = false , however, if you try the following test code:

 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 

You get the conclusion:

 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> 
+12
source share

I finished this show:

 new File(myFilename).withWriter { def printer = new XmlNodePrinter(new PrintWriter(it)) printer.preserveWhitespace = true printer.print(myXmlNode) } 
0
source share

All Articles