8

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 output XML has a lot of unnecessary white spaces. Looks like I'm doing something wrong with writing to file.

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

def printer = new XmlNodePrinter(new PrintWriter(writer))
printer.preserveWhitespace = true
printer.print(xml)
yegor256
  • 102,010
  • 123
  • 446
  • 597

2 Answers2

12

What happens if you replace:

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

with:

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

-- edit --

As pointed out, it feels 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 output:

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>
tim_yates
  • 167,322
  • 27
  • 342
  • 338
  • If the problem is that he's got too much whitespace in his output, shouldn't he use `preserveWhitespace = false`? – pmartin Feb 28 '11 at 16:02
  • thanks. I summarized your answer inside my question :) I didn't understand why it has to be so long (the answer), but anyway, many thanks. – yegor256 Feb 28 '11 at 17:41
1

I ended up with this blurb:

new File(myFilename).withWriter {
    def printer = new XmlNodePrinter(new PrintWriter(it))
    printer.preserveWhitespace = true
    printer.print(myXmlNode)
}
slim
  • 2,545
  • 1
  • 24
  • 38