2011-02-28 81 views
8

这是我的Groovy代码:如何使用Parser实例将XML写入文件?

// ... 
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有很多不必要的空白空间。看起来我在写文件时做错了什么。

ps。感谢Tim,这是它应该如何工作(以上就要用这些三行被替换的例子的最后一行):

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

回答

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

如果问题是他的输出中有太多空白,他不应该使用'preserveWhitespace = false'吗? – pmartin 2011-02-28 16:02:03

+0

@pmartin增加了一个例子 – 2011-02-28 16:14:58

+0

谢谢。我在我的问题中总结了你的答案:)我不明白为什么它必须这么长(答案),但无论如何,非常感谢。 – yegor256 2011-02-28 17:41:36

0

我结束了与此导语:

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