如何使用解析器实例将XML写入文件?

8

这是我的Groovy代码:

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

代码可以运行,但输出的XML中有很多不必要的空格。看起来我在写入文件时做错了什么。

附:感谢Tim,这是正确的操作(上面示例的最后一行应替换为以下三行):

def printer = new XmlNodePrinter(new PrintWriter(writer))
printer.preserveWhitespace = true
printer.print(xml)
2个回答

12

如果你替换其中的内容会发生什么:

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

使用:

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

-- 编辑 --

正如指出的那样,感觉应该是preserveWhitespace = false,但是如果您尝试以下测试代码:

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
你会得到输出:
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>

如果问题是他的输出中有太多的空格,那么他不应该使用 preserveWhitespace = false 吗? - pmartin
谢谢。我在问题中总结了您的答案 :) 我不明白为什么答案要这么长,但无论如何,非常感谢。 - yegor256

1
我最终得到了这段文字:

我以这个简短的描述作为结尾:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接